【问题标题】:Ocasional error warning when CakePHP is writing to the cacheCakePHP 写入缓存时偶尔出现错误警告
【发布时间】:2012-09-24 23:04:56
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

  • 帮助不大,但我自己也遇到过几次。不幸的是,除了遇到它时运行sudo chmod -R 777 app/tmp,还没有真正找到解决方法。
  • 当我不小心 chown -R 0777 heh 时遇到了这个问题

标签: cakephp caching cakephp-2.2


【解决方案1】:

这可能发生在不同于 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
));

【讨论】:

  • 好的,谢谢。我无法想象除了 apache 之外的其他进程会更改这些文件,但无论如何。我已经添加了那个面具,我会在接下来的几天里监控它,看看它是否有效。
  • 好的,这似乎有效。给其他人的注意事项:您还需要删除现有的缓存文件,以便 cake 使用 666 权限重新创建它们。否则他们将只保留 664 权限。
  • 嗯,有趣的是这不在 API 中。我以前用来解决这个问题的是一个简单的 bash 脚本,它调用我需要运行的 Cake Console,然后更改 App/tmp 中所有文件的权限。我会将这个提交给 Cake 团队。
  • 在蛋糕 3 中似乎也是如此
  • 附加提示设置'mask' => 0666的区别是:如果设置它,缓存文件对用户,,组和所有其他用户具有读写权限(- rw-rw-rw-)。如果不设置'mask'选项,只有用户和组有读写权限,其他用户只能读(-rw-rw-r--)。如果没有该掩码设置,当您使用 cake Shell 并且它像 apache 用户一样作为另一个用户运行时会遇到问题,例如 bitnami LAMP 堆栈:Apache 作为守护程序用户运行,cake Shell 通常作为 bitnami 用户运行
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    sudo adduser martinlutherking www-data
    

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

    【讨论】:

      【解决方案4】:

      以防万一有人看到这个并想知道它在 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
          ],
      ],
      

      【讨论】:

        猜你喜欢
        • 2014-08-03
        • 2011-07-07
        • 2011-12-03
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多