2011-01-11 14 views
23

समय-समय पर, मुझे यह अजीब चेतावनी संदेश प्राप्त होता है। यह आमतौर पर पेज रीलोड पर चला जाता है। इसका क्या मतलब है। मैं googled लेकिन कोई फायदा नहीं हुआ।क्रिप्टिक जीसी कैश प्रविष्टि का अर्थ

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

मुझे लगता है कि यह किसी भी तरह से 'एपीसी' से संबंधित है क्या आपके पास एपीसी स्थापित है? – tawfekov

+2

एपीसी (शायद) स्मृति से बाहर चल रहा है। http://pecl.php.net/bugs/bug.php?id=16966 – teemitzitrone

+0

यह समस्या ठीक हो गई है (चेतावनी से डीबग करने के लिए डाउनग्रेड किया गया है): https://github.com/krakjoe/apcu/pull/45/files – aimfeld

उत्तर

34

निश्चित रूप से यह समस्या एपीसी, पैकेज एपीसी-3.1.6-आर 1 से स्रोत कोड से जाती है। जब उपयोगकर्ता कैश या फ़ाइल कैश में आइटम डाला जाता है, तो यह फ़ंक्शन कॉल किया जाता है।

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

एपीसी विन्यास (http://cz.php.net/manual/en/apc.configuration.php#ini.apc.gc-ttl) से

apc.gc_ttl integer

सेकंड की संख्या है कि एक कैश प्रविष्टि कचरा-संग्रह की सूची पर रह सकती है। यह मान उस स्थिति में विफल-सुरक्षित प्रदान करता है जब एक कैश की गई स्रोत फ़ाइल निष्पादित करते समय सर्वर प्रक्रिया मर जाती है; यदि वह स्रोत फ़ाइल संशोधित की गई है, तो पुराने संस्करण के लिए आवंटित स्मृति को तब तक पुनः दावा नहीं किया जाएगा जब तक यह टीटीएल तक नहीं पहुंच जाता। इस सुविधा को अक्षम करने के लिए शून्य पर सेट करें।

हम संदेश प्राप्त "जीसी कैश प्रविष्टि '% s' (देव =% d ino =% d)% d सेकंड के लिए जीसी सूची पर था" या "जी सी कैश प्रविष्टि 'के लिए जीसी सूची पर% s'was % d सेकंड "इस हालत में:

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

पहली शर्त मतलब है, आइटम बाद में तो apc.gc_ttl सेकंड पहले नष्ट कर दिया है और इसके अभी भी कचरा में कलेक्टर सूची था। सेकेंड की स्थिति का मतलब है, आइटम अभी भी संदर्भित है।

उदा। जब अप्रत्याशित रूप से मृत्यु हो गई, संदर्भ कम नहीं हुआ है। एपीसी कैश में पहला apc.ttl सेकेंड सक्रिय है, फिर हटा दिया गया है (इस आइटम पर अगला हिट नहीं है)। अब आइटम कचरा कलेक्टर सूची (जीसी) पर है और apc.gc_ttl टाइमआउट चल रहा है। जब apc.gc_ttl कम होता है (अब - item_deletion_time), चेतावनी लिखी जाती है और आइटम पूरी तरह से फ़्लश हो जाता है।

गंभीर त्रुटियों के लिए अपने लॉग (वेब ​​सर्वर, PHP, सिस्टम/कर्नेल) को जांचने का प्रयास करें, उदा। PHP, वेब सर्वर segfault।

संबंधित मुद्दे