2011-01-11 4 views
23

時を経て、私はこの奇妙な警告メッセージを受け取ります。通常、ページのリロード時に消えます。どういう意味ですか。私はグーグルではなく、役に立たない。暗号GCキャッシュエントリとは何ですか?

Warning: include(): GC cache entry '/.../...class.php' (dev=2049 ino=37120489) was on gc-list for 3840 seconds in /.../...class.php on line 111 
+1

「APC」に関係していると思いますが、APCをインストールしていますか? – tawfekov

+2

APCが(おそらく)メモリ不足です。 http://pecl.php.net/bugs/bug.php?id=16966 – teemitzitrone

+0

この問題は修正されました(警告からデバッグにダウングレードされました):https://github.com/krakjoe/apcu/pull/45/files – aimfeld

答えて

34

間違いなくこの問題は、apc-3.1.6-r1パッケージのソースコードAPCから発生します。 itemがユーザーのキャッシュまたはファイルキャッシュに挿入されると、この関数が呼び出されます。

APCの設定( http://cz.php.net/manual/en/apc.configuration.php#ini.apc.gc-ttl

apc.gc_ttl integer

から

static void process_pending_removals(apc_cache_t* cache TSRMLS_DC) 
{ 
slot_t** slot; 
time_t now; 

/* This function scans the list of removed cache entries and deletes any 
* entry whose reference count is zero (indicating that it is no longer 
* being executed) or that has been on the pending list for more than 
* cache->gc_ttl seconds (we issue a warning in the latter case). 
*/ 

if (!cache->header->deleted_list) 
    return; 

slot = &cache->header->deleted_list; 
now = time(0); 

while (*slot != NULL) { 
    int gc_sec = cache->gc_ttl ? (now - (*slot)->deletion_time) : 0; 

    if ((*slot)->value->ref_count <= 0 || gc_sec > cache->gc_ttl) { 
     slot_t* dead = *slot; 

     if (dead->value->ref_count > 0) { 
      switch(dead->value->type) { 
       case APC_CACHE_ENTRY_FILE: 
        apc_warning("GC cache entry '%s' (dev=%d ino=%d) was on gc-list for %d seconds" TSRMLS_CC, 
         dead->value->data.file.filename, dead->key.data.file.device, dead->key.data.file.inode, gc_sec); 
        break; 
       case APC_CACHE_ENTRY_USER: 
        apc_warning("GC cache entry '%s'was on gc-list for %d seconds" TSRMLS_CC, dead->value->data.user.info, gc_sec); 
        break; 
      } 
     } 
     *slot = dead->next; 
     free_slot(dead TSRMLS_CC); 
    } 
    else { 
     slot = &(*slot)->next; 
    } 
} 
} 

キャッシュエントリがガベージコレクションのリストに残り続ける秒数。この値は、キャッシュされたソースファイルの実行中にサーバープロセスが停止した場合にフェールセーフを提供します。そのソースファイルが変更された場合、古いバージョンに割り当てられたメモリは、このTTLに達するまで再利用されません。この機能を無効にするには、ゼロに設定します。

"GCキャッシュエントリ '%s'(dev =%d ino =%d)が%d秒間gc-listにありました"または "GCキャッシュエントリ '%s'はこの状態では%d秒」:

(gc_sec > cache->gc_ttl) && (dead->value->ref_count > 0)

まず条件手段、項目がapc.gc_ttl秒前、後、その後削除され、そのまだガベージコレクタのリストにありました。秒の条件は、項目がまだ参照されていることを意味します。

プロセスが予期せず死んだ場合、参照は減少しません。最初のapc.ttl秒はAPCキャッシュでアクティブになり、次に削除されます(このアイテムに次のヒットはありません)。アイテムがガベージコレクタリスト(GC)にあり、apc.gc_ttlタイムアウトが実行されています。 apc.gc_ttlが(now - item_deletion_time)より小さい場合、警告が書き込まれ、アイテムは完全にフラッシュされます。

ログ(Webサーバ、PHP、システム/カーネル)の重大なエラーをチェックしてみてください。 PHPは、Webサーバーのsegfault。

関連する問題