2011-10-19 7 views
36

पीएचपी पुस्तिका, session.gc_probability और session.gc_divisor राज्य कि जीसी इस संभावना के आधार पर हो जाएगा से। मै समझ गया।पीएचपी कूड़ा संग्रह स्पष्टीकरण

क्या मैं पर स्पष्ट नहीं कर रहा हूँ कि क्या यह संभावना सत्र आधार या समग्र द्वारा एक सत्र पर है।

तो यदि मेरी संभावना 1% (1/100) है कि जीसी होगा, तो इसका मतलब यह है कि यदि एक सत्र विस्तारित रहता रहता है, तो प्रत्येक बार 1% परिवर्तन होता है जो विशिष्ट सत्र साफ हो जाएगा? या इसका मतलब यह है कि सभी मौजूदा सत्रों में से 1% (साथ ही साथ नए) अन्य सभी मौजूदा सत्रों के लिए जीसी को ट्रिगर करेंगे?

मैं बहुत यकीन है कि यह बाद, मैं सिर्फ यह सुनिश्चित करना चाहते है कर रहा हूँ।

इस सवाल का उद्देश्य है कि हमारी साइट पर, मैं उन लंबी अवधि के सत्र (6 महीने) करना चाहते है। यदि सभी सत्रों में से 1% जीसी को ट्रिगर करते हैं, तो वह प्रभावी रूप से उस दीर्घकालिक सत्र के उद्देश्य को हटा देता है, क्योंकि जीसी हर घंटे या दो होने लगती है।

+2

बहुत ही रोचक सवाल! +1 –

+0

संबंधित http://stackoverflow.com/questions/3865303/debian- आधारित- सिस्टम- सत्र- किल्ड-at-30-minutes-in-special-cron-how-to-overri –

+0

किसी और के लिए इस प्रयास को पढ़ने के लिए ऊपर, सत्र फ़ाइलों के 6 महीने के साथ यह गंभीर प्रदर्शन मुद्दों का कारण बन सकता है (जैसा कि नीचे बताया गया है)। हालांकि, आप कस्टम सत्र हैंडलर लिखने के लिए session_set_save_handler() का उपयोग कर सकते हैं जो एफएस के बजाय डीबी का उपयोग करेगा, कई प्रदर्शन दंड को अस्वीकार कर देगा। – Meep3D

उत्तर

10

हर बार जब एक PHP स्क्रिप्ट निष्पादित होती है और सत्र शुरू होती है तो संभावना है कि यह पुराने सत्र को बंद करने वाले सत्र फ़ोल्डर से गुजर जाएगा।

सफाई केवल वे सत्र जो एक निश्चित समय से नहीं पहुंचा रहे थे को नष्ट करेगा। हालांकि PHP गारंटी नहीं देता है कि सत्र उस समय के भीतर नष्ट हो जाएगा।

आपका लंबी अवधि के सत्र की रणनीति ठीक काम करना चाहिए, लेकिन आप 0.1%

के लिए बाहर देखने के लिए एक और बात की तरह कुछ करने के लिए 1% कम करने के लिए चाहते हो सकता है कि ऑपरेटिंग सिस्टम के दौरान अपने को/tmp फ़ोल्डर को साफ हो सकता है रीबूट करें ताकि PHP PHP ऐसा न करे।

+0

मैंने संभावना को 1/100 से 1/1000000 (0.000001%) से कम कर दिया है। मुझे उम्मीद है कि इस मुद्दे को हल करता है। साथ ही, यह एक Magento साइट है, इसलिए सत्र/var/सत्र में संग्रहीत हैं। जहां तक ​​मुझे पता है, यह फ़ोल्डर सर्वर द्वारा स्पर्श नहीं किया गया है (लेकिन मुझे लगता है कि अगर मैगेंटो व्यवस्थापक से "फ्लश कैश स्टोरेज" चुना जाता है तो इसे हटा दिया जाएगा)। – pspahn

+0

ओह, आशा करते हैं कि Magento वैकल्पिक सत्र लागू नहीं करता है जो gc_ * सेटिंग्स को अनदेखा कर देगा। – romaninsh

+5

और संभावना को कम करने के दुष्प्रभाव यह है कि आप पुराने सत्रों के साथ अपनी हार्ड ड्राइव भर देंगे। और सत्रों को खोजने और लोड करने में लंबा और लंबा समय लगेगा, और दिन के अंत में एक न्यूनतम मौका है, फिर भी आप सत्रों को मिटा देंगे (भले ही यह दूरस्थ रूप से छोटा हो)। आप वैकल्पिक विकल्प देख सकते हैं जैसे कि अपना स्वयं का सत्र हैंडलर लिखना और वास्तव में नियंत्रित करना कि आप कौन से सत्र हटा सकते हैं और कब। यह मुश्किल नहीं है। http://www.php.net/manual/en/function.session-set-save-handler.php – bumperbox

2

मैं इस पर एक विशेषज्ञ नहीं हूँ, लेकिन मैनुअल पढ़ने से, मैं एक और सेटिंग, session.gc_maxlifetime ओर आपका ध्यान आकर्षित होगा। डॉक्स से:

session.gc_maxlifetime सेकंड जिसके बाद डेटा साफ 'कचरा' के रूप में देखा जाएगा और संभवतः की संख्या निर्दिष्ट करता है। कचरा संग्रह सत्र प्रारंभ के दौरान हो सकता है (session.gc_probability और session.gc_divisor के आधार पर)।

आप एक उपयुक्त मूल्य के लिए यह सेटिंग सेट तो अगर (आधा एक वर्ष के लिए 60 * 60 * 24 * 365/2, तो 15768000), तो उपयुक्त डेटा नहीं कचरा संग्रहण के लिए पात्र कोई बात नहीं क्या अन्य सेटिंग्स हैं हो जाएगा।

+1

मैंने पहले से ही gc_maxlifetime को 15552000 (180 दिन) सेट कर दिया है - सब कुछ देव साइट पर ठीक से काम कर रहा था, लेकिन एक बार जब मैंने इसे लाइव किया, तो यह उपयोगकर्ताओं को लॉग इन पेज पर वापस लात मारने से पहले थोड़ी देर के लिए काम करता था। – pspahn

+7

क्या यह मान "सत्र निर्माण के बाद सेकंड" या "अंतिम संशोधन के बाद सेकंड" का अर्थ है? –

+0

इसे कचरा कलेक्टर डालने का संयोजन होना चाहिए, इसलिए आपका सत्र डेटा शब्दकोश में होगा, लेकिन आपके कुकी जीवनकाल को भी बढ़ाएगा, इसलिए सत्र सत्र की उस पंक्ति के लिए अद्वितीय सत्र आईडी सहेजता है यदि मैं इसे सही ढंग से समझता हूं। – vikingben

7

पिछली बार जब मैंने विभाजक और संभाव्यता का उपयोग करके बोलने के लिए session_start() "पासा लुढ़का" के लिए प्रत्येक कॉल को स्रोत देखा। यदि आप हिट करते हैं, तो यह session.save_path निर्देशिका से सभी फ़ाइलों को हटा देगा जो session.gc_maxlifetime से पुराने थे। मैं भूल जाता हूं कि क्या यह फ़ाइल के संशोधन या एक्सेस समय का उपयोग करता है, हालांकि इसे सामान्य परिस्थितियों में कोई फर्क नहीं पड़ता क्योंकि php स्क्रिप्ट निष्पादन के अंत में डिफ़ॉल्ट रूप से सत्र फ़ाइल को ओवरराइट करता है, इसलिए मॉड और एक्सेस समय लगभग हमेशा निकटता से मेल खाते हैं।

// Rough psuedo code of how php's session_start() function works regarding garbage collection. 
function session_start() { 
    $percentChanceToGC = 100 * ini_get('session.gc_probability')/ini_get('session.session.gc_divisor'); 
    $shouldDoGarbageCollection = rand(1, 100) < $percentChanceToGC; 
    if ($shouldDoGarbageCollection) { 
     $expiredCutoffTime = time() - ini_get('session.gc_maxlifetime'); 
     foreach (scandir(ini_get('session.save_path')) as $sessionFile) { 
      if (filemtime($sessionFile) < $expiredCutoffTime) { 
       unlink($sessionFile); 
      } 
     } 
    } 

    // ... rest of code .... 
} 

मुझे नहीं पता कि आप कितने सत्र फाइलों को समाप्त करने जा रहे हैं, यदि आप उन्हें कम से कम 6 महीने तक जीना चाहते हैं। इस बात पर विचार करें कि पीएचपी के लिए अपनी उम्र निर्धारित करने के लिए हजारों फाइलों को स्टेटस करने में थोड़ी देर लग सकती है। शायद इस डेटा के टिकाऊ भंडारण के लिए अन्य विकल्पों पर विचार करें। या आप php gc को अक्षम कर सकते हैं और स्टेल सत्र फ़ाइलों को हटाने के लिए बस एक क्रॉन नौकरी चला सकते हैं।अन्यथा, अनुरोधों का 1% जीसी ट्रिगर करने वाला है और PHP के लिए इंतजार करना है; दूसरे शब्दों में यह संभवतः अंतराल हो सकता है।