【问题标题】:Getting 'unable to write' errors in CakePHP site在 CakePHP 站点中出现“无法写入”错误
【发布时间】:2012-10-10 20:18:41
【问题描述】:

我有一个 CakePHP 网站,它抛出错误(一开始很好,并且已经在线几个月了 - 不确定问题是从什么时候开始的)。

我明白了:

警告 (512):_cake_core_ 缓存无法写入“cake_dev_en-us” 到 Apc 缓存 [CORE/Cake/Cache/Cache.php,第 310 行] 警告 (512): _cake_core_ 缓存无法将“cake_en-us”写入 Apc 缓存 [CORE/Cake/Cache/Cache.php,第 310 行] 警告 (512):_cake_model_ 缓存无法将“default_projects”写入 Apc 缓存

[CORE/Cake/Cache/Cache.php, line 310]
Warning (512): _cake_model_ cache was unable to write 'default_projects' to Apc cache [CORE/Cake/Cache/Cache.php, line 310]
Warning (512): _cake_model_ cache was unable to write 'default_clients' to Apc cache [CORE/Cake/Cache/Cache.php, line 310]
Warning (512): _cake_model_ cache was unable to write 'default_clients' to Apc cache [CORE/Cake/Cache/Cache.php, line 310]
Warning (512): _cake_model_ cache was unable to write 'default_projectpages' to Apc cache [CORE/Cake/Cache/Cache.php, line 310]
Warning (512): _cake_model_ cache was unable to write 'default_projectpages' to Apc cache [CORE/Cake/Cache/Cache.php, line 310]
Warning (512): _cake_model_ cache was unable to write 'default_settings' to Apc cache [CORE/Cake/Cache/Cache.php, line 310]
Warning (512): _cake_model_ cache was unable to write 'default_settings' to Apc cache [CORE/Cake/Cache/Cache.php, line 310]

我已确保 tmp 目录是可写的(已将其以及所有包含的文件夹和文件设置为 0777;还检查了它是否正确更新,确实如此);我还通过将调试级别设置为 0 来关闭 core.php 中的错误报告。

该网站的大部分内容都很好,但是这个特定页面是由 AJAX 引入的,我不知道这是否有什么不同。

我已经通过在 cake-error 上设置“display: none”来修复它,但我需要了解为什么会发生这种情况。首先,是什么导致了错误?其次,为什么忽略核心设置?

【问题讨论】:

  • 警告说它不能写入 Apc 缓存,这与文件缓存不同。你知道你用的是什么类型的缓存吗?如果不尝试在 core.php 中使用文件缓存
  • 可能是因为 APC 的分配内存不足。
  • 谢谢 - 我没有设置任何缓存引擎配置,当我启用“文件”时,错误消失了。感谢您的帮助!

标签: cakephp cakephp-2.0


【解决方案1】:

我在 Zend Server 7 上运行 CakePHP 站点时遇到此 APC 缓存错误。不幸的是,Zend Server 似乎附带 fake/substitute APC 层,并且来自我的测试变量数据存储不起作用(函数总是返回 false),这是 CakePHP 抱怨的。

ZendServer 仪表板中的此屏幕显示 APC。

解决办法是:

  1. 通过编辑 app/Config/core.php 以注释掉以下行来完全禁用 APC 缓存...

    /*if (extension_loaded('apc') && function_exists('apc_dec') && (php_sapi_name() !== 'cli' || ini_get('apc.enable_cli'))) {
        $engine = 'Apc';
    }*/
    
  2. 或者,您只能有条件地加载 APC。就我而言,我只想在本地开发服务器上禁用它,但让它在生产中保持活动状态。

    $isLocalDevelopment = strpos($_SERVER['SERVER_NAME'], '.dev');
    if (!$isLocalDevelopment && extension_loaded('apc') && function_exists('apc_dec') && (php_sapi_name() !== 'cli' || ini_get('apc.enable_cli'))) {
        $engine = 'Apc';
    }
    

【讨论】:

    【解决方案2】:

    我有时会遇到这个错误,我认为这是由于 APC 内存不足引起的(由于应用程序负载过重)。 APC 的错误配置也可能是造成这种情况的原因。

    http://php.net/manual/en/apc.configuration.php:

    服务器运行后,捆绑的 apc.php 脚本 应将扩展名复制到 docroot 中的某个位置并查看 使用浏览器,因为它提供了内部的详细分析 APC 的工作原理。如果在 PHP 中启用了 GD,它甚至会显示一些 有趣的图表。当然,首先要确保的是 实际上是缓存文件。如果 APC 正在工作,则缓存完整计数 number(左侧)将显示缓存的次数 已达到最大容量,必须强制清理所有条目 在最后 apc.ttl 秒内未访问过的文件。这个数字是 在配置良好的缓存中最小化。

    所以我建议分析 apc.php 的输出(在 ubuntu 上,典型地存储在 /usr/share/doc/php-apc/ 中),并作为增加为 APC 分配的内存段大小的第一个修复。

    在 php.ini 中添加一行

    apc.shm_size = 64M(或任何合适的大小,默认为32M)

    【讨论】:

      【解决方案3】:

      关于apache用户的写权限,我平时在开发模式的时候做一个

      # chmod -R 777 app/tmp
      

      但在生产中,您必须为 apache Web 服务器用户执行可写的 app/tmp 目录

      最好的问候

      【讨论】:

      • 我刚刚看到它与APC有关,对于答案的错误很抱歉,但是是的,使用FILE引擎是可以的,但是有更好的缓存引擎作为MemCache,但是如果你可以可以使用文件引擎解决
      【解决方案4】:

      为您的应用缓存更改 tmp 文件夹中的组所有者:

      sudo chown -R User:_www /Applications/Site/app/tmp/
      

      然后确保你已经设置了足够的权限 775

      【讨论】:

      • 我认为您的答案是指File 缓存,而问题与使用APC 缓存有关。
      • 你说得对,这是关于 APC 缓存权限,可能的问题确实关注,缓存的核心配置 Cache::config('<i>cake_model</i>', array( 'engine ' =&gt; $engine, 'prefix' =&gt; $prefix . 'cake_model_', 'path' =&gt; CACHE . 'models' . DS, 'serialize' =&gt; ($engine === 'File'), 'duration' =&gt; $duration, 'mask' =&gt; 0666 ));
      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多