Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php APC缓存不断消失_Php_Apc - Fatal编程技术网

Php APC缓存不断消失

Php APC缓存不断消失,php,apc,Php,Apc,缓存似乎每10分钟或更长时间随机重置一次。我想我用错了。我正在使用APC缓存一个3兆字节的HTML响应。在任何给定的时间都有大约50个。据我所知,使用mmap_file_mask将使用文件而不是内存,因此它不会占用我的内存,但我仍然认为它会耗尽内存并自行重置 它是一个具有1 GB内存的VPS,通常在运行free时,它显示使用了512MB到750 MB的内存(这是我当前的256 MB SHM大小)。我是否应该将SHM大小从256增加到更大 我应该使用APC来实现这一点,还是将响应存储在文件中并直接

缓存似乎每10分钟或更长时间随机重置一次。我想我用错了。我正在使用APC缓存一个3兆字节的HTML响应。在任何给定的时间都有大约50个。据我所知,使用mmap_file_mask将使用文件而不是内存,因此它不会占用我的内存,但我仍然认为它会耗尽内存并自行重置

它是一个具有1 GB内存的VPS,通常在运行
free
时,它显示使用了512MB到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
编辑:我把内存更新到512MB,持续了几个小时,然后我就上床睡觉了。当我醒来时,所有的缓存都不见了。好像是记忆问题?我可能仅仅依赖于文件或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
然后它只显示缓存数组,对于调试我认为的任何问题都没有什么真正有用的。缓存前清除没有什么突出的地方。前后随机缓存没有太多变化。不知道这个问题,512MB的内存应该足以容纳3MB50个条目。即使这样,我也不想让它使用内存。我希望它使用文件

编辑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的ttl。APC将在内存不足时刷新所有缓存

使用apc.php脚本查看内存的使用情况。您应该保留20%的可用内存(运行数小时后)

如果您没有足够的ram,只需微调APC以仅缓存访问频率最高的文件

在这里检查我的答案(不是46票赞成的那一个错了)

我也有同样的问题,这让我快发疯了

实际原因是服务器时间与脚本设置时间不同。

在命令行上使用以下命令检查服务器上的日期:

date
然后使用以下方法检查您的PHP时间:

<?php echo date("Y-m-d H:i:s"); ?>
您可以在此处找到此功能支持的时区列表:


我希望这对您有所帮助,我花了很长时间将我的脚本转换为使用APC,它的速度很快,现在它们正在按照我指定的时间长度进行存储和保存。

我今天遇到了同样的问题,在这里找到了解决方案:


您需要转到
AccesWHM>Apache配置>管道日志配置
启用管道式Apache日志

,那么现在该怎么办呢。缓存是否随机重置?信息函数怎么说?添加了无用的信息函数输出。信息显示缓存未重置。您的代码中可能有错误,而不是在APC中。此外,您还剪切了输出中的
缓存列表。你应该把它展示出来,苏。您还应该向代码展示如何生成信息数据。我用我的APC代码对其进行了更新,请注意,这是在我知道我可以通过信息阵列访问创建时间之前。PHP在Apache上作为模块运行,是通过fastcgi吗?如果是fastcgi,那么您使用的是PHP-FPM吗?某些使用fastcgi但不使用php fpm的配置不使用共享缓存,而是每个php进程使用一个缓存,从而产生意外的结果。
sysctl-a | grep-E“shmall | shmmax”
命令给了我:
错误:“不允许操作”读取密钥“net.ipv4.route.flush”kernel.shmall=2097152 kernel.shmmax=33554432
,我想因为我用的是
mmap
就可以了?尽管如此,我还是会使用apc包中的apc.php脚本来更改ttl和报告backStart,它会告诉您您的apc是使用mmap还是shm。我正在使用mmap。我将ttl设置为1天,6小时后,我设置的缓存消失了。我不认为这是内存问题,因为每当我检查APC时,它使用了我给它的512中的280MB。我在APC中激活了“deleted”作用域,但它对我没有任何效果。我仍然不明白为什么,但我只打算以旧的方式存储在files/mysql中。不幸的是,两者之间的日期完全相同。
date_default_timezone_set('UTC');