我正在使用MAMP在本地开发CakePHP 2.2站点。我经常会收到一个或多个与此类似的警告,关于无法写入一个或多个缓存文件:
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)如果它只是偶尔失败一次,我可以安全地忽略它吗?如果它每次尝试失败,我该如何解决?
提前感谢您的帮助!
答案 0 :(得分:14)
当与Apache不同的进程在缓存中创建文件时,可能会发生这种情况。例如,当您运行shell命令时可能就是这种情况,因为您可能以与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
));
答案 1 :(得分:1)
如果您想避免给予“其他”群组读/写权限,请在此处查看我的其他解决方案:
答案 2 :(得分:0)
很简单,假设你是一个sudoer,你的用户名是martinlutherking
sudo adduser martinlutherking www-data
这种蛋糕控制台命令可以读取由apache2创建的缓存文件,但是您可能需要执行反向组添加以确保www-data可以读取由martinlutherking创建的缓存文件
答案 3 :(得分:0)
以防任何人看到这个,并想知道它在cakePHP 3.x中是如何工作的:
修改/config/app.php
并将'mask' => 0666
添加到
/**
* Configure the cache adapters.
*/
'Cache' => [
'default' => [
'className' => 'File',
'path' => CACHE,
'url' => env('CACHE_DEFAULT_URL', null),
'mask' => 0666
],
并且您可能还想将其添加到日志文件中:
/**
* Configures logging options
*/
'Log' => [
'debug' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'debug',
'levels' => ['notice', 'info', 'debug'],
'url' => env('LOG_DEBUG_URL', null),
'mask' => 0666
],
'error' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'error',
'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
'url' => env('LOG_ERROR_URL', null),
'mask' => 0666
],
],