CakePHP3を触ってみました 〜シェル&マスク〜

マスクと言えばやはりダースベイダーかなぁ

おまとめ三行

2系から3系への移り変わりを見て行きましょー
さすがはスリーセブン。フィーバーしまくってんな
ここらで一枚トーストが恐い

シェルはCakePHPのバージョンがメジャーアップするたびに変わってきた感があります。1.3から2系に変わったときも、ちょこっと変わりました。

ちなみにそんときの記事がこれ。

Shellが動かねえぞ(Cake2系にバージョンアップしたら)

ってことで、今日は2系から3系への移り変わりを見て行きましょー。



2系のおさらい

上の記事にも書いてあるから、あえて書くこともないかもしれないですが、さら〜っとだけ、CakePHP2のシェルも確認しときましょう。

//app/Console/Command/SampleShell.php
App::uses('Shell', 'Console');
class SampleShell extends Shell {
  function execute() {
    〜 処理を書く 〜
  }
}

//shellの実行
# /usr/bin/php /var/www/cakephp/Cake/Console/cake.php Sample execute -app /var/www/cakephp/app

こうですね。ここでは「/var/www/cakephp」の下に、appやらCakeフォルダがあるという仮定。

appフォルダの中にConsoleってフォルダがあって、その中にさらにCommandってフォルダがあって、その下にshellファイルを作成します。そんであとは自分で作ったメソッドを実行すると。



3系のshell

3系では、srcフォルダの下にShellというフォルダがあるので、その中にshellファイルを作成します。

//src/Shell/SampleShell.php
namespace App\Shell;
class SampleShell extends Shell {
  public function execute() {
    〜 処理を書く 〜
  }
}

中身については、2系の頃とそんなには変わってないですかね。

ただ、シェルを実行するときのコマンドの打ち方は、ちょっと変わりました。

# /var/www/cakephp/bin/cake sample execute

2系の頃より、随分とシンプルになった気がしますね。

srcフォルダと同じ階層にbinというフォルダがあり、その中にcakeという実行ファイルらしきものが入っています。実行権限がない場合は、パーミッションを与えてあげてください。エサは与えなくて良いです。

シェル名の部分は、僕が試してみた限りは、大文字でも小文字でも動きます。

# /var/www/cakephp/bin/cake Sample execute
# /var/www/cakephp/bin/cake sample execute

どっちでも良いっぽい。



ちなみに、メソッド名を「main」にした場合は、記述を省略することができるようです。

//src/Shell/SampleShell.php
namespace App\Shell;
class SampleShell extends AppShell {
  public function main() {
    〜 処理を書く 〜
  }
}

//shellの実行
# /var/www/cakephp/bin/cake sample

これで正常に動きます。もしかしたら2系のときもそうだったのかな? そういえば試してなかったや。



cacheファイルのパーミッション

もし、シェルをroot権限で実行した場合。

tmpフォルダの中にあるキャッシュファイルの所有者が、rootになってしまうことがあるかもしれない。もしそうなると、パーミッション次第ではapacheがファイルを書き込んだりできなくなってしまうので、画面を表示したときにエラーが出てしまう。

failed to open stream: Permission denied in 〜

何かこんなエラーが出る。

いくつかやり方は考えられると思いますが、たぶん一番手っ取り早いのは、キャッシュファイルのパーミッションが666とか777になるように設定してしまうことだと思います。

configフォルダの中にあるapp.phpにキャッシュファイルの設定項目があるんですが、そこでパーミッションの設定ができます。

'Cache' => [
  'default' => [
    'className' => 'File',
    'path' => CACHE,
  ],

  '_cake_core_' => [
    'className' => 'File',
    'prefix' => 'myapp_cake_core_',
    'path' => CACHE . 'persistent/',
    'serialize' => true,
    'duration' => '+2 minutes',
    'mask' => 0666,//666にする
  ],

  '_cake_model_' => [
    'className' => 'File',
    'prefix' => 'myapp_cake_model_',
    'path' => CACHE . 'models/',
    'serialize' => true,
    'duration' => '+2 minutes',
    'mask' => 0666,//666にする
  ],
],

「mask」っていう項目を設定することで、ファイルのパーミッションが設定できます。例えばこれをビーストナンバーである666にしとけば、所有者がrootだろうがapacheだろうが、誰でも書き込める。さすがビーストナンバー。やりたい放題だな。もちろん777でも良い。もっとやりたい放題できる。さすがはスリーセブン。フィーバーしまくってんな。







実行コマンドの書き方が簡単になったのはありがたいかもですね。この程度なら僕の脳みそでも覚えられそう。2系の頃は毎回書き方を忘れて、「crontab -l」で中を見にいってたからな……どこかに書いとけよって気もするけどw

ところで、ビーストとゴーストって似てるね。おっかない存在ってところも似てるし。

ビーストとイーストも似てるな。イーストは別に怖くないけど。いや、そうでもないか。イースト菌が腸にたまると、過敏性腸症候群とかいう病気にかかる恐れがあるらしいからな。腸内でイースト菌の増殖がブーストすると、いつかバーストしちまうってことだ。気をつけよう。

ゴーストは実在するかどうかも分からないって考えると、イーストの方が怖いのかもしれないね。ビーストも腸を持っている以上は、イーストにやられる可能性があるわけだから、イーストが最恐ってことかもしれん。

つまり恐怖カースト的には、イーストが一番上で、その下にビースト、ゴーストと続き、怖いかどうかよく分からないローストされたお肉が来て、ワーストはイースト菌から作られたパンを焼いてバターをペーストしたトーストあたりで良いのかな?

ここらで一枚トーストが恐い。



その他のCakePHP3を触ってみましたの記事はこちら
まとめという名の箸休め

まだコメントはいただけてないみたい……
もしかしたら何か関連しているかも?