2011-01-11 8 views
23

Zaman zaman bu garip uyarı iletisini alıyorum. Genellikle sayfa yeniden yüklenir. Bu ne anlama geliyor. Ben googled ama boşuna.Kriptik GC önbellek girdisi ne anlama geliyor

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

Bir şekilde APC'nin APC'nin kurulu olduğu ile ilgili olduğunu düşünüyorum. – tawfekov

+2

APC (muhtemelen) bellek yetersiz. http://pecl.php.net/bugs/bug.php?id=16966 – teemitzitrone

+0

Bu sorun giderilmiştir (uyarıdan hata ayıklamasına kadar): https://github.com/krakjoe/apcu/pull/45/files – aimfeld

cevap

34

Bu sorun, APC, apc-3.1.6-r1 paketindeki kaynak koddan kaynaklanır. Öğe kullanıcı önbelleğine veya dosya önbelleğine eklendiğinde, bu işlev çağrılır. APC yapılandırması (http://cz.php.net/manual/en/apc.configuration.php#ini.apc.gc-ttl) Gönderen

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; 
    } 
} 
} 

apc.gc_ttl integer

bir önbellek girdisi çöp toplama listede kalabilir saniye sayısı. Bu değer, önbelleğe alınmış bir kaynak dosyayı yürütürken bir sunucu işleminin ölmesi durumunda bir hata güvenliği sağlar; Bu kaynak dosya değiştirilirse, bu TTL'ye ulaşıncaya kadar eski sürüm için ayrılan bellek geri alınmaz. Bu özelliği devre dışı bırakmak için sıfıra ayarlayın.

"GC önbellek girdisi '% s' (dev =% d ino =% d) gc listesinde% d saniye vardı" veya "GC önbellek girişi"% s ', gc listesinde Bu durumda% d saniye":

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

İlk koşul araçları, öğe apc.gc_ttl saniye önce sonra sonra silinir ve hala çöp toplayıcı liste edildi. Saniye koşulu, öğeye hala başvurulmaktadır.

örn. işlem beklenmedik bir şekilde öldüğünde, referans azalmaz. İlk apc.ttl saniye APC önbelleğinde aktiftir, daha sonra silinir (bu öğenin bir sonraki vuruşu yoktur). Şimdi öğe çöp toplayıcı listesinde (GC) ve apc.gc_ttl zaman aşımı çalışıyor. Apc.gc_ttl daha az olduğunda (şimdi - item_deletion_time), uyarı yazılır ve madde tamamen temizlenir. Günlüklerinizi (web sunucusu, php, system/kernel) kritik hatalara, örn. php, web sunucusu segfault.