我正在使用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
答案 0 :(得分:1)
我已经找到了问题,最终我认为“默认”值应该与CakePHP认为的“默认”值之间存在混淆。
在cake / libs / cache.php中,有一个write函数,用于设置缓存条目的键,值和持续时间,并将其传递给相应引擎的写入函数(在本例中为APC)。在此函数中,它检查core.php中的缓存配置设置,以查看是否已在此处指定了持续时间。来自core.php的代码:
Cache::config('default', array(
'engine' => 'Apc',
'duration'=> 9000,
'probability'=> 100,
'prefix' => Inflector::slug(APP_DIR) . '_',
));
你可以看到第一个参数是字符串'default',我假设这意味着所有APC缓存的默认值应该使用以下数组,其中包括9000秒的持续时间。但是,在上述写入函数中,它检查实例的__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天',而不是我通过的价值。解决方案是在core.php中创建另外几行,如下所示:
Cache::config('_cake_core_', array(
'engine' => 'Apc',
'duration'=> 9000,
'probability'=> 100,
'prefix' => Inflector::slug(APP_DIR) . '_',
));
它会覆盖Cake的“默认”或硬编码值10秒或999天,具体取决于调试值。
答案 1 :(得分:0)
第一个建议可能是最简单的:切换到Zend Optimizer(内置于5.5)。
第二个建议是......你检查了默认设置吗?通常位于/etc/php.d/apc.ini中 这些可以覆盖Cake的设置(不使用Cake,所以不确定,但我知道APC设置是配置级别)。
答案 2 :(得分:0)
您所谈论的用户缓存条目ttl不是由您设置的ttl设置的。它由apc.rfc1867-ttl设置。
请在此处查看:http://www.php.net/manual/en/apc.configuration.php#ini.apc.rfc1867-ttl
这是用户可以上传的文件的生命周期。