2

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

編集: メモリを 512 MB に更新し、それが数時間続いた後、就寝しました。目が覚めたとき、すべてのキャッシュがなくなっていました。メモリの問題である可能性がありますか?私はファイルや MySQL だけに頼るかもしれません。

尋ねられた情報は次のとおりです。

[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

そして、キャッシュの配列を表示するだけで、問題をデバッグするのに本当に役立つものは何もありません。キャッシュの事前クリアで目立ったものはありません。前後のランダム キャッシュ クリアから大きな変更はありません。3 MB x 50 エントリには 512 MB のメモリで十分なはずです。それでも、メモリを使用したくありません。ファイルを使用したい。

編集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
// ...
?>
4

3 に答える 3

1

私はまったく同じ問題を抱えていて、それが私を夢中にさせていました!

これの実際の原因は、サーバーの時間がスクリプトの設定時間と異なっていたことです。

コマンドラインで次のコマンドを使用して、サーバーの日付を確認します。

date

次に、次を使用して PHP 時間を確認します。

<?php echo date("Y-m-d H:i:s"); ?>

違いがある場合(これは私が持っていたものです)、これがキャッシュがクリアされている理由です。

apc.php ファイルを確認すると、10 分後にクリアされる前に、40 分以上エントリがあります。ウーフー!

日付/時刻が異なる場合は、こちらを参照して date コマンドを使用してサーバーの時刻を設定するか、次を使用してサーバーに一致するように PHP タイムゾーンを設定できます。

date_default_timezone_set('UTC');

この関数でサポートされているタイムゾーンのリストは、http ://www.php.net/manual/en/timezones.php で確認できます。

これがお役に立てば幸いです。私はスクリプトを APC を使用するように変換するのに何年も費やしました。それは非常に高速であり、現在は指定した期間だけ保存および保存されています。

于 2013-04-02T09:22:56.203 に答える
1

0 の ttl を使用しないでください。メモリが不足すると、APC はすべてのキャッシュをフラッシュします。

apc.php スクリプトを使用して、メモリの使用状況を確認します。空きメモリの 20% を保持する必要があります (数時間の実行後)。

十分な RAM がない場合は、最も頻繁にアクセスされるファイルのみをキャッシュするように APC を微調整してください。

ここで私の答えを確認してください (46 票が上がったものではなく、間違っています) PHP で「プールにメモリを割り当てることができません」の原因は何ですか?

于 2012-12-17T14:22:15.787 に答える
0

今日同じ問題に遭遇しました。ここで解決策を見つけました: http://www.itofy.com/linux/cpanel/apc-cache-reset-every-2-hours/

およびに移動する必要がAccesWHM > Apache Configuration > Piped Log ConfigurationありEnable Piped Apache Logsます。

于 2015-03-10T14:27:43.797 に答える