似乎随机每10分钟或更长时间缓存似乎重置。我想我错了。我正在使用APC缓存3兆字节的HTML响应。在任何给定时间约有50个。据我所知,使用mmap_file_mask将使用文件而不是内存,所以它不会占用我的内存,但我仍然认为它耗尽内存并重置自己。
它是具有1 GB内存的VPS,通常在运行free
时显示使用512 MB到750 MB(这与我当前的256 MB SHM大小相同)。我应该将SHM大小从256增加到更高吗?
我应该使用APC执行此操作还是将响应存储在文件中更好?只是使用它?
我的APC INI如下:
extension = apc.so
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 256
apc.optimization = 0
apc.num_files_hint = 10000
apc.ttl = 0
apc.user_ttl = 0
apc.gc_ttl = 0
apc.cache_by_default = 1
apc.filters = ""
apc.mmap_file_mask = "/tmp/apc.XXXXXX"
apc.slam_defense = 0
apc.file_update_protection = 2
apc.enable_cli = 0
apc.max_file_size = 10M
apc.stat = 1
apc.write_lock = 1
apc.report_autofilter = 0
apc.include_once_override = 0
apc.localcache = 0
apc.localcache.size = 512
apc.coredump_unmap = 0
apc.stat_ctime = 0
编辑:我将内存更新为512 MB,并持续了几个小时,然后我去睡觉了。当我醒来时,所有缓存都消失了。似乎它可能是一个内存问题?我可能只是依赖文件或MySQL,调试APC不值得在页面加载时节省的毫秒数。
以下是提问的信息:
[num_slots] => 8192
[ttl] => 0
[num_hits] => 490
[num_misses] => 390
[num_inserts] => 13663
[expunges] => 0
[start_time] => 1355644615
[mem_size] => 5271328
[num_entries] => 204
[file_upload_progress] => 1
[memory_type] => mmap
[locking_type] => pthread mutex
[cache_list] => Array
然后它只显示缓存的数组,对于调试我认为的任何问题没什么用。预缓存清除没有什么突出的。来自前后随机缓存的更改没有太多变化。不知道这个问题,512 MB的内存应该足够3 MB x 50条目。即便如此,我甚至不希望它使用内存。我希望它使用文件。
编辑2:
根据要求,这是我使用的APC代码:
<?php
$unique_options = "query_options_that_are_unique_to_1_of_the_50_caches";
$refresh_interval = 60*15;
$refresh_triggered = (isset($_REQUEST['refresh']));
// Try to get the APC Cache, if fails, then it was never created
if ($cache_array = apc_fetch(md5($unique_options))) {
// I got the cache, using its creation_time, see if its refreshable
$seconds_since_last_refresh = (time() - $cache_array['creation_time']);
$can_refresh = ($seconds_since_last_refresh >= $refresh_interval);
} else {
// Apparently this has never had a cache created, so create it
apc_store(md5($unique_options), array('data'=> get_json($unique_options), 'creation_time'=>time()), 0);
$cache_array = apc_fetch(md5($unique_options));
$refresh_triggered = false;
}
// If the cache already existed, and the user is attempting to refresh the cache, and they are allowed to refresh it, then refresh it.
if($refresh_triggered) {
if($can_refresh) {
apc_store(md5($unique_options), array('data'=> get_json($unique_options), 'creation_time'=>time()), 0);
$cache_array = apc_fetch(md5($unique_options));
} else {
echo "You can only refresh every 15 minutes<br><br>";
}
}
$current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && !in_array(strtolower($_SERVER['HTTPS']),array('off','no'))) ? 'https' : 'http' . '://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$url_parts = parse_url($current_url);
$url_without_query = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'];
foreach($_GET as $key => $value) {
if($key != "refresh")
$query .= "$key=$value&";
}
echo "Data was last refreshed " . ($seconds_since_last_refresh) . "seconds ago (<a href='$url_without_query?{$query}refresh'>Refresh Now</a>)<br><br>";
$data = $cache_array['data'];
// Now process the the information that was cached
// ...
?>
答案 0 :(得分:1)
永远不要使用0的ttl。当内存不足时,APC将刷新所有缓存。
使用apc.php脚本查看内存的使用情况。你应该保留20%的可用内存(运行几小时后)。
如果你没有足够的RAM,只需微调APC以仅缓存最常访问的文件。
在这里检查我的答案(不是那个46票的人就错了) What is causing "Unable to allocate memory for pool" in PHP?
答案 1 :(得分:1)
我有完全相同的问题,这让我疯了!
实际原因是服务器时间与脚本设置时间不同。
在命令行上使用此命令检查服务器上的日期:
date
然后使用以下方法检查您的PHP时间:
<?php echo date("Y-m-d H:i:s"); ?>
如果存在差异(这就是我所拥有的),那么这就是清除缓存的原因。
检查我的apc.php文件我现在有超过40分钟的条目,之后它们将在10分钟后被清除。哇噢!
如果您的日期/时间不同,则可以使用日期命令see here设置服务器时间,或者设置PHP时区以匹配使用的服务器:
date_default_timezone_set('UTC');
您可以在此处找到此功能支持的时区列表:http://www.php.net/manual/en/timezones.php
我希望这会对你有所帮助,我花了很长时间将我的脚本转换为使用APC,它快速闪电,现在它们被存储和放置了。保存了我指定的时间长度。
答案 2 :(得分:0)
我今天遇到了同样的问题,在这里找到了解决方案: http://www.itofy.com/linux/cpanel/apc-cache-reset-every-2-hours/
您需要转到AccesWHM > Apache Configuration > Piped Log Configuration
和Enable Piped Apache Logs
。