CakePHP写入缓存时偶尔会出现错误警告

时间:2012-10-03 23:31:40

标签: cakephp caching cakephp-2.2

我正在使用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)如果它只是偶尔失败一次,我可以安全地忽略它吗?如果它每次尝试失败,我该如何解决?

提前感谢您的帮助!

4 个答案:

答案 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)

如果您想避免给予“其他”群组读/写权限,请在此处查看我的其他解决方案:

https://stackoverflow.com/a/18703956/385979

答案 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
    ],
],