6

我正在使用 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

4 回答 4

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
));
于 2012-10-04T09:48:55.297 回答
1

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

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

于 2013-09-09T17:46:02.780 回答
0

真的很简单,假设你是一个 sudoer 并且你的用户名是 martinlutherking

sudo adduser martinlutherking www-data

这样 cake 控制台命令可以读取 apache2 创建的缓存文件,但是您可能需要执行反向组添加以确保 www-data 可以读取 martinlutherking 创建的缓存文件

于 2017-08-16T16:43:00.607 回答
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
    ],
],
于 2018-02-16T18:13:18.463 回答