2011-01-11 105 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 2011-01-11 11:05:53

回答

34

当然,这个问题来自APC,包apc-3.1.6-r1的源代码。当项目被插入到用户缓存或文件缓存中时,该函数被调用。

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配置(http://cz.php.net/manual/en/apc.configuration.php#ini.apc.gc-ttl

apc.gc_ttl integer

的秒的高速缓存条目可保留在垃圾收集列表上的号码。如果服务器进程在执行缓存的源文件时死机,则此值提供失效保护;如果该源文件被修改,则直到达到此TTL时,为旧版本分配的内存才会被回收。设置为零以禁用此功能。我们得到消息“GC缓存条目'%s'(dev =%d ino =%d)在gc-list上为%d秒”或者“GC缓存条目'%s'在gc-list上在这种情况下%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服务器段错误。