CakePHP + APC 用户缓存条目超时问题


CakePHP + APC User Cache Entries Timeout Issue

我正在使用CakePHP(版本1.3.8(和APC(版本3.1.3p1(进行以下设置:

APC.ini

extension=apc.so
apc.enabled=1
apc.enable_cli=0
apc.shm_size=128
apc.stat=0
apc.num_files_hint=10000
apc.user_entries_hint=10000
apc.max_file_size=5
apc.user_ttl = 3600
apc.ttl = 3600

蛋糕芯设置:

Cache::config('default', array(
        'engine' => 'Apc',
        'duration'=> '+5 minutes',
        'probability'=> 100,
        'prefix' => Inflector::slug(APP_DIR) . '_',
));

由于某种原因,列出的用户缓存条目(通过 mysite.com/apc.php 查看(的超时均为 86313600 秒(999 天(。我不知道为什么它会这么高,因为我在 apc 中同时设置了 apc.user_ttl 和 apc.ttl.ini并通过 Cake 设置了持续时间。我尝试清除所有APC缓存并重新启动Apache。

任何协助将不胜感激。谢谢。

编辑:认为值得一提的是,通过 apc 显示的运行时设置.php确实根据 apc.ini 配置设置了正确的 TTL:

apc.cache_by_default: 1
apc.canonicalize: 1
apc.coredump_unmap: 0
apc.enable_cli: 0
apc.enabled: 1
apc.file_md5: 0
apc.file_update_protection: 2
apc.filters 
apc.gc_ttl: 3600
apc.include_once_override: 0
apc.lazy_classes: 0
apc.lazy_functions: 0
apc.max_file_size: 5
apc.mmap_file_mask  
apc.num_files_hint: 10000
apc.preload_path
apc.report_autofilter: 0
apc.rfc1867: 0
apc.rfc1867_freq: 0
apc.rfc1867_name: APC_UPLOAD_PROGRESS
apc.rfc1867_prefix: upload_
apc.rfc1867_ttl: 3600
apc.shm_segments: 1
apc.shm_size: 128
apc.stat: 0
apc.stat_ctime: 0
apc.ttl: 3600
apc.use_request_time: 1
apc.user_entries_hint: 10000
apc.user_ttl: 3600
apc.write_lock: 1
我已经

解决了这个问题,最终混淆了我认为的"默认"值应该是什么和 CakePHP 认为的"默认"值应该是什么。

在 cake/libs/cache.php 中,有一个写入函数,它设置缓存条目的键、值和持续时间,并将其传递给相应引擎的写入函数(在本例中为 APC(。在此函数中,它会从核心检查缓存配置设置.php以查看您是否在那里指定了持续时间。来自核心的代码.php:

Cache::config('default', array(
    'engine' => 'Apc',
    'duration'=> 9000,
    'probability'=> 100,
    'prefix' => Inflector::slug(APP_DIR) . '_',
));

您可以看到第一个参数是字符串"default",我认为这意味着所有 APC 缓存的默认值都应使用以下数组,其中包括 9000 秒的持续时间。但是,在前面提到的 write 函数中,它会检查实例的 __name 变量,在缓存条目的情况下,该变量设置为"_cake_core_",而不是默认字符串值"default"。不久之后,它转到配置设置并查找值"_cake_core_"。因为不应该找到它(因为我没有明确设置它(,或者如果 Cake 设置了一些值,它将被我的默认值覆盖(根据我对默认值的定义(,它将依赖于我上面设置的内容。然而,事实并非如此。在 cake/libs/configure.php 的__loadBoostrap函数中:

if (Configure::read() >= 1) {
    $duration = '+10 seconds';
} else {
    $duration = '+999 days';
}
if (Cache::config('_cake_core_') === false) {
    Cache::config('_cake_core_', array_merge((array)$cache['settings'], array(
        'prefix' => $prefix . 'cake_core_', 'path' => $path . DS . 'persistent' . DS,
        'serialize' => true, 'duration' => $duration
    )));
}

因此,如果 debug 设置为 0(这是 Configure::read(( 在未传递任何内容时返回的内容(并且配置字符串为"_cake_core_"(就像我的缓存条目一样(,它将$duration设置为"+999 天",而不是我传递的值。解决方案是在核心中创建另外几行.php如下所示:

Cache::config('_cake_core_', array(
    'engine' => 'Apc',
    'duration'=> 9000,
    'probability'=> 100,
    'prefix' => Inflector::slug(APP_DIR) . '_',
));

这将覆盖 Cake 的"默认"或硬编码值 10 秒或 999 天,具体取决于调试值。

第一个建议可能是最简单的:切换到 Zend Optimizer(内置在 5.5 中(。

第二个建议是...您是否检查了默认设置?通常位于/etc/php.d/apc 中.ini这些可以覆盖蛋糕的设置(未使用蛋糕,所以不确定,但我知道APC设置是配置级别(。

您正在谈论的用户缓存条目 ttl 不是由您设置的 ttl 设置的。它由 apc.rfc1867-ttl 设置。

看这里:http://www.php.net/manual/en/apc.configuration.php#ini.apc.rfc1867-ttl

这是用户可以上传的文件的生存期。