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を触ってみましたの記事はこちら
まとめという名の箸休め
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください