6

MAMP を使用してローカルで CakePHP 2.2 サイトを開発しています。ときどき、1 つまたは複数のキャッシュ ファイルに書き込めないという、次のような警告が 1 つまたは複数表示されます。

Warning: SplFileInfo::openFile(/Applications/MAMP/htdocs/mywebsite/www/app/tmp/cache/persistent/myapp_cake_core_cake_console_en-au): failed to open stream: Permission denied in /Applications/MAMP/htdocs/mywebsite/www/lib/Cake/Cache/Engine/FileEngine.php on line 313

奇妙なことに、/tmp は 777、tmp/cache は 777、tmp/cache/persistent は 777 です (心配しないでください... サーバーでは 777 にはなりません!)。tmp/cache/persistent 内のファイル自体は 644 ですが、Cake がそのファイルを作成および管理していると想定しており、必要な権限でそれを行っています。

ページを更新するだけで、エラーは消えます (そして、しばらくしてから再び表示されます)。私は明示的なキャッシングを行っていないので、これは Cake が自動的に行っていることです。

だから私の質問は:

a) この Cake の自動キャッシングはどのように機能しますか? ページが更新されるたびにそのファイルに書き込もうとしていて、たまにしか失敗しませんか? それとも、たまにそのファイルに書き込もうとしているだけで、試行するたびに失敗していますか?

b) たまにしか失敗しない場合は、無視しても問題ありませんか? また、試行するたびに失敗する場合は、どうすれば修正できますか?

助けてくれてありがとう!

4

4 に答える 4

14

これはおそらく、Apacheとは異なるプロセスがキャッシュにファイルを作成するときに発生します。これは、たとえば、シェルコマンドを実行する場合に当てはまります。これは、おそらくapacheとは別のユーザーとして実行するためです。

デフォルトでは、ファイルキャッシュは、ファイルを作成したユーザーのみがファイルを変更できるようにする権限を持つファイルを作成しますが、これは、core.phpのキャッシュ構成でマスクを設定することで修正できます。

Cache::config('_cake_core_', array(
    'engine' => $engine,
    'prefix' => 'cake_core_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));

Cache::config('_cake_model_', array(
    'engine' => $engine,
    'prefix' => 'cake_model_',
    'path' => CACHE . 'models' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));
于 2012-10-04T09:48:55.297 に答える