2011-01-11 10 views
23

Cada tanto, recibo este extraño mensaje de advertencia. Por lo general, se va en la página de recarga. Qué significa eso. Busqué en Google pero fue en vano.¿Qué significa la entrada críptica del caché del 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

Supongo que de alguna manera está relacionado con 'APC' ¿tiene instalado APC? – tawfekov

+2

APC se está (probablemente) quedando sin memoria. http://pecl.php.net/bugs/bug.php?id=16966 – teemitzitrone

+0

Este problema ha sido reparado (degradado de advertencia a depuración): https://github.com/krakjoe/apcu/pull/45/files – aimfeld

Respuesta

34

Definitivamente este problema va desde APC, código fuente del paquete apc-3.1.6-r1. Cuando se inserta un elemento en el caché del usuario o en el caché de archivos, se llama a esta función.

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

desde la configuración de APC (http://cz.php.net/manual/en/apc.configuration.php#ini.apc.gc-ttl)

apc.gc_ttl integer

El número de segundos que una entrada de caché puede permanecer en la lista de recogida de basura. Este valor proporciona un fail-safe en el caso de que un proceso de servidor muera mientras se ejecuta un archivo fuente en caché; si ese archivo fuente se modifica, la memoria asignada para la versión anterior no se recuperará hasta que se alcance este TTL. Establézcalo en cero para desactivar esta función.

Recibimos mensajes "Entrada de caché GC '% s' (dev =% d ino =% d) estaba en gc-list para% d segundos" o "Entrada de caché GC '% s' estaba en gc-list para % d segundos" en esta condición:

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

primer medio de condiciones, se suprime el apartado más tarde, entonces hace apc.gc_ttl segundos y su todavía en la basura lista colector. La condición de segundos significa que el artículo todavía está referenciado.

p. Ej. cuando el proceso murió inesperadamente, la referencia no se reduce. Los primeros segundos apc.ttl están activos en el caché de APC, luego se eliminan (no hay un próximo clic en este elemento). Ahora el artículo está en la lista de recolectores de basura (GC) y se está ejecutando apc.gc_ttl. Cuando apc.gc_ttl es menor que (ahora - item_deletion_time), se escribe una advertencia y el ítem se vacía por completo.

Intente comprobar sus registros (servidor web, php, sistema/kernel) a errores críticos, p. php, servidor web segfault.

Cuestiones relacionadas