2017-02-04 8 views
7

मैं उपयोग कर रहा हूँ laravel कैशिंग (remember() विधि) को पढ़ने में नाकाम रहने के:Laravel कभी कभी कैश इस तरह एक कोड के साथ एक वेबसाइट पर

$postedItems = Cache::remember('home_posted_items', $this->cacheTimes['postedItems'], function() { 

    /* the stuff that prepares data */ 

    return ['items' => $items, 'firstItemNumber' => $firstItem]; 
}); 

समस्या यह है कि कभी कभी (हर कुछ दिन, मैं कहता हूँ चाहते हैं) है कैश्ड फ़ाइल दूषित हो जाती है और नतीजतन मेरे पास कैश समाप्त होने तक डाउनटाइम होता है (जब तक कि मैं इसे मैन्युअल रूप से साफ़ नहीं करता)।

[2017-02-04 22:01:34] production.ERROR: ErrorException: unserialize(): Error at offset 131059 of 131062 bytes in /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php:78 
Stack trace: 
#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'unserialize(): ...', '/home/path/to/...', 78, Array) 
#1 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php(78): unserialize('a:2:{s:7:"item...') 
#2 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php(47): Illuminate\Cache\FileStore->getPayload('home_posted_ite...') 
#3 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(98): Illuminate\Cache\FileStore->get('home_posted_ite...') 
#4 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(202): Illuminate\Cache\Repository->get('home_posted_ite...') 
#5 [internal function]: Illuminate\Cache\Repository->remember('home_posted_ite...', 1, Object(Closure)) 
#6 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php(318): call_user_func_array(Array, Array) 
#7 /home/path/to/app/bootstrap/cache/compiled.php(6089): Illuminate\Cache\CacheManager->__call('remember', Array) 
#8 /home/path/to/app/app/Http/Controllers/HomeController.php(197): Illuminate\Support\Facades\Facade::__callStatic('remember', Array) 

कैसे इस समस्या को हल करने के लिए:

यहाँ त्रुटि ढेर संगत हो सकती का एक हिस्सा है?

अनुभव से मुझे पता है कि कैश साफ़ करने से समस्या हल हो जाती है। तो ऐसा लगता है कि समस्या फाइलों में कुछ भ्रष्टाचार है। मुझे लगता है कि अगर मैं देख सकता हूं कि "फ़ाइल अपठनीय है" और केवल कैश साफ़ करें (Cache::forget(...)), तो समस्या को हल करना चाहिए।

ऐसी त्रुटि को नोटिस करने का सबसे अच्छा तरीका क्या होगा? ऐसा लगता है कि फ़ाइल को पुनर्प्राप्त करने के सभी तर्क remember() विधि के अंदर छिपा हुआ है। क्या मुझे बस इसे अनदेखा करना चाहिए और अन्य तरीकों का उपयोग करना चाहिए, कुछ निम्न की तरह?

if (!($postedItems = @Cache::get('home_posted_items')) 
{ 
    // prepare data 

    $postedItems = ['items' => $items, 'firstItemNumber' => $firstItem]; 

    Cache::put('home_posted_items', $postedItems, $this->cacheTimes['postedItems']); 
} 
+0

मेरे पास पहले लार्वेल 4.2 के साथ एक समान समस्या थी, उस समय कैश की फ़ाइलों को हटाया जाता था और फिर कैशिंग कक्षा कैश पाने की कोशिश करेगी और विफल हो जाती है क्योंकि फ़ाइल पठनीय नहीं है (नहीं मौजूद है) और कैश की सफाई के बाद सबकुछ ठीक काम करता है। मैं जो कहना चाहता हूं वह यह है कि यदि आप याद रखने के बजाय कैश :: डालते हैं तो यह कुछ भी नहीं बदलेगा, एक बार ऐसा करने का एकमात्र तरीका कैश को अमान्य करना है जब आप जानते हैं कि यह होने वाला है –

+0

आप डिस्क कोटा या आप शायद अंतरिक्ष से बाहर हो रहे हैं? या क्या कुछ अप्रत्याशित चार स्ट्रिंग में हैं जिन्हें आप बेअसर करने की कोशिश कर रहे हैं? इम्हो को आगे बढ़ाने का सबसे अच्छा तरीका FileStore.php की पंक्ति 78 पर सामग्री को VarDump करना है। आप जो पाएं, मुझे उसके बारे में बताएं। – DonCallisto

+0

@ डॉन कैलिस्टो अंतरिक्ष में कोई समस्या नहीं है, मैं इससे बाहर नहीं जा रहा हूं। लेकिन ऐसा लगता है कि हालांकि फाइलें किसी कारण से कट जाती हैं। मैंने एक अपवाद पकड़ा और इसे लॉग फ़ाइल में लिखा - यह पता चला कि यह अंत में कट गया था।यह अजीब बात है क्योंकि यह कभी-कभी होता है और ऐसा लगता है कि कोई संसाधन सीमाएं नहीं पहुंचती हैं। –

उत्तर

0

यह एक अनुमति मुद्दा नहीं लगता है (आप स्टैक ट्रेस में # 1 देख सकते हैं), किसी भी तरह laravel अधिभावी है (भ्रष्ट) कैश फ़ाइलें। फ़ाइल के अंत में आपको यह पता लगाना होगा कि आपके पास कौन सी सामग्री है।

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

और यहां डीबग करने का सबसे अच्छा तरीका है। https://stackoverflow.com/a/10152996/3305978

1

आईएमएचओ फ़ाइल चालक के साथ एक समस्या हो सकती है। मुझे लगता है कि यदि आपके पास समवर्ती अनुरोधों को संभालने में सक्षम एक अच्छा वेब सर्वर है तो समस्या यह है कि फ़ाइल चालक समरूपता को संभालने में सक्षम नहीं है।

और यह इस तथ्य से संबंधित है कि आमतौर पर फाइल सिस्टम स्वयं एक ही फाइल को पढ़ने/लिखने के लिए अलग-अलग समवर्ती प्रक्रियाओं को संभालने में इतना अच्छा नहीं होता है।

अंत में मैं सलाह देता हूं कि आप चालक को समेकन को संभालने में कुछ और सक्षम करने के लिए स्विच करें, यानी मेमकैच या रेडिस, लेकिन डेटाबेस भी पर्याप्त होना चाहिए।

आप here सत्र के लिए एक ही सुझाव पा सकते हैं, दूसरी पोस्ट देखें, और मुझे लगता है कि कैश फ़ाइल ड्राइवर के लिए भी प्रासंगिक हो सकता है।

+0

यह एक समाधान नहीं है जिसे मैं जगह में डाल सकता हूं लेकिन मुझे विश्वास है कि आप सही मुद्दों पर ध्यान दे रहे हैं। मुझे लगता है कि यह बाउंस के लिए पर्याप्त है क्योंकि यहां कोई भी बेहतर नहीं है :) –

+0

आपको बहुत धन्यवाद @ Džuris आशा है कि यह उत्तर सहायक हो सकता है – dparoli

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