CakePHP+;APC用户缓存项超时问题

CakePHP+;APC用户缓存项超时问题,php,cakephp,apc,Php,Cakephp,Apc,我使用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::

我使用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.ini中设置了apc.user_ttl和apc.ttl,并通过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

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

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

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

看这里:


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

我已经解决了这个问题,结果是混淆了我认为的“默认”值应该是什么和CakePHP认为的“默认”值应该是什么

在cake/libs/cache.php中,有一个write函数,用于设置缓存项的键、值和持续时间,并将其传递给相应引擎的write函数(在本例中为APC)。在这个函数中,它检查core.php中的缓存配置设置,以查看您是否在其中指定了持续时间。core.php中的代码:

Cache::config('default', array(
    'engine' => 'Apc',
    'duration'=> 9000,
    'probability'=> 100,
    'prefix' => Inflector::slug(APP_DIR) . '_',
));
您可以看到第一个参数是字符串'default',我假设这意味着所有APC缓存的默认值都应该使用以下数组,其中包括9000秒的持续时间。但是,在前面提到的write函数中,它会检查实例的uuu name变量,对于缓存项,该变量将设置为“_cake_core_uu”,而不是默认的字符串值“default”。不久之后,它将转到配置设置并查找值“\u cake\u core\u”。因为这不应该被找到(因为我没有显式地设置它),或者如果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()在未传递任何内容时返回的内容),并且配置字符串为“\u cake\u core”(与我的缓存条目一样),它会将$duration设置为“+999天”,而不是我传递的值。解决方案是在core.php中再创建几行,如下所示:

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

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

如果可能,我宁愿不从APC切换。至于第二个建议,我展示了上面的apc.ini文件,其中正确设置了TTL。我不完全理解RFC1867缓存项的用法,但我认为它们在这里不相关-首先是因为缓存被关闭了,还因为我尝试在apc.ini中设置它,但没有解决问题。