2011-01-11 34 views
23

Thỉnh thoảng, tôi nhận được thông báo cảnh báo lạ này. Nó thường đi trên tải lại trang. Điều đó nghĩa là gì. Tôi googled nhưng vô ích.Mục nhập bộ nhớ cache cryptic GC có nghĩa là

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

Tôi đoán bằng cách nào đó liên quan đến 'APC' bạn đã cài đặt APC chưa? – tawfekov

+2

APC (có thể) hết bộ nhớ. http://pecl.php.net/bugs/bug.php?id=16966 – teemitzitrone

+0

Sự cố này đã được khắc phục (bị hạ cấp khỏi cảnh báo để gỡ lỗi): https://github.com/krakjoe/apcu/pull/45/files – aimfeld

Trả lời

34

Chắc chắn vấn đề này xảy ra từ APC, mã nguồn từ gói apc-3.1.6-r1. Khi mục được chèn vào bộ nhớ cache của người dùng hoặc bộ đệm tệp, hàm này được gọi.

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

Từ cấu hình APC (http://cz.php.net/manual/en/apc.configuration.php#ini.apc.gc-ttl)

apc.gc_ttl integer

Số giây mà một mục bộ nhớ cache có thể vẫn còn nằm trong danh sách thu gom rác. Giá trị này cung cấp một không an toàn trong trường hợp một quá trình máy chủ chết trong khi thực thi một tệp nguồn được lưu trữ; nếu tệp nguồn đó được sửa đổi, bộ nhớ được cấp cho phiên bản cũ sẽ không được khôi phục cho đến khi TTL này đạt được. Đặt thành 0 để tắt tính năng này.

Chúng tôi nhận được thông báo "Mục nhập bộ nhớ cache GC ' % d giây" trong tình trạng này:

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

phương tiện điều kiện đầu tiên, mục đã bị xóa sau đó apc.gc_ttl giây và danh sách nhà sưu tập vẫn còn trong thùng rác của nó. Điều kiện thứ hai có nghĩa là, mục vẫn được tham chiếu.

ví dụ: khi quá trình bất ngờ chết, tham chiếu không giảm. Apc.ttl giây đầu tiên hoạt động trong bộ đệm APC, sau đó bị xóa (không có lần truy cập tiếp theo nào trên mục này). Bây giờ mục là trên danh sách bộ gom rác (GC) và thời gian chờ apc.gc_ttl đang chạy. Khi apc.gc_ttl nhỏ hơn (bây giờ - item_deletion_time), cảnh báo được viết và mục được xóa hoàn toàn.

Hãy thử kiểm tra nhật ký của bạn (máy chủ web, php, hệ thống/hạt nhân) với các lỗi nghiêm trọng, ví dụ: php, máy chủ web segfault.

Các vấn đề liên quan