2009-03-17 30 views
52

मेरी वेबसाइट पर मैं PHP सत्र का उपयोग करता हूं। सत्र जानकारी मेरी ./session पथ में फ़ाइलों में संग्रहीत है। कुछ महीनों के बाद मुझे पता चला कि इन सत्र फ़ाइलों को कभी भी हटाया नहीं गया है, अब तक इस निर्देशिका में उनमें से 145,000 हैं।क्लीनअप PHP सत्र फ़ाइलें

इन्हें कैसे साफ किया जाना चाहिए? क्या मुझे इसे प्रोग्रामेटिक रूप से करना है, या एक ऐसी सेटिंग है जिसे मैं कहीं भी उपयोग कर सकता हूं जिसमें यह सफाई स्वचालित रूप से हो जाएगी?

EDIT उल्लेख करने के लिए भूल गए: यह साइट एक प्रदाता पर चलता है, इसलिए मेरे पास कमांड लाइन तक पहुंच नहीं है। मेरे पास ftp-access है, लेकिन सत्र फाइलें किसी अन्य उपयोगकर्ता से संबंधित हैं (एक वेबसर्वर प्रोसेस मुझे लगता है) मुझे लगता है कि पहले जवाब से मुझे लगता है कि यह सिर्फ सर्वर या PHP पर एक सेटिंग नहीं है, इसलिए मुझे लगता है कि मैं PHP में इसके लिए कुछ कार्यान्वित करना होगा, और उस समय को ब्राउज़र से (शायद घर पर अपनी मशीन पर चलने वाली क्रॉन नौकरी से)

उत्तर

51

की तरह लग रहा सत्र ठीक से संभाल करने के लिए, http://php.net/manual/en/session.configuration.php पर एक नज़र डालें।

  • session.gc_probability
  • session.gc_divisor
  • session.gc_maxlifetime

ये कचरा कलेक्टर को नियंत्रित (जीसी) चल रहा है की संभावना:

वहाँ आप इन चरों मिल जाएगा प्रत्येक पृष्ठ अनुरोध के साथ।

आप अपनी स्क्रिप्ट या .htaccess फ़ाइल की शुरुआत में ini_set() के साथ सेट कर सकते हैं ताकि आप कुछ हद तक निश्चित हो जाएं कि वे कभी-कभी हटा दिए जाएंगे।

+7

नोट: यदि आप सत्र फ़ाइलों को संग्रहीत करने के लिए उपनिर्देशिका विकल्प का उपयोग कर रहे हैं (ऊपर session.save_path देखें), तो कचरा संग्रह स्वचालित रूप से * नहीं * होता है। आपको शेल स्क्रिप्ट, क्रॉन एंट्री, या किसी अन्य विधि के माध्यम से अपना कचरा संग्रह करने की आवश्यकता होगी। उदाहरण के लिए, निम्न स्क्रिप्ट सेटिंग session.gc_maxlifetime सेटिंग 1440 (1440 सेकंड = 24 मिनट) के बराबर होगी: सीडी/पथ/से/सत्र; find -cmin +24 | xargs rm – Jehy

+0

@Jehy ऐसा लगता है कि PHP अब कस्टम सत्र.save_path होने पर भी कचरा संग्रह कर सकता है। –

+0

@DarrellBrogdon क्या आपके पास कस्टम session.save पथ का उपयोग करते समय PHP के स्वचालित कचरा संग्रह पर संसाधन या अधिक जानकारी है? यह अच्छा होगा अगर यह मामला था। – maartenmachiels

5

दिए गए थ्रेसहोल्ड से पुरानी फ़ाइलों को हटाने के लिए क्रॉन का उपयोग करें। उदाहरण के लिए उन फ़ाइलों को हटाने के लिए जिन्हें कम से कम एक सप्ताह तक नहीं पहुंचाया गया है।

find .session/ -atime +7 -exec rm {} \; 
+0

आपके उत्तर के लिए धन्यवाद, जैसा कि मैंने कहा था मेरे प्रश्न का सबसे आखिरी संस्करण इसे कमांड लाइन से चलाने का विकल्प नहीं है, मैं देखूंगा कि क्या मैं अपने प्रदाता को क्रॉन में ऐसा कुछ करने के लिए मना सकता हूं। – Jack

33

Debian/Ubuntu के एक cronjob में /etc/cron.d/php5

# /etc/cron.d/php5: crontab fragment for php5 
# This purges session files older than X, where X is defined in seconds 
# as the largest value of session.gc_maxlifetime from all your php.ini 
# files, or 24 minutes if not defined. See /usr/lib/php5/maxlifetime 

# Look for and purge old sessions every 30 minutes 
09,39 *  * * *  root [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm 

maxlifetime स्क्रिप्ट बस मिनट की संख्या देता है परिभाषित के साथ इस संभालती एक सत्र php की जाँच करके जिंदा रखा जाना चाहिए .ini, यह इस

#!/bin/sh -e 

max=1440 

for ini in /etc/php5/*/php.ini; do 
     cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true); 
     [ -z "$cur" ] && cur=0 
     [ "$cur" -gt "$max" ] && max=$cur 
done 

echo $(($max/60)) 

exit 0 
+0

आपके उत्तर पॉल के लिए धन्यवाद, जैसा कि मैंने अपने प्रश्न के आखिरी संस्करण में कहा था, इसे कमांड लाइन से चलाने का विकल्प नहीं है, मैं देखूंगा कि क्या मैं अपने प्रदाता को क्रॉन में ऐसा कुछ करने के लिए मना सकता हूं। – Jack

+0

इस के लिए धन्यवाद, मैंने पाया कि किसी ने इसे अप्रभावी करने के लिए कट और चिपकाया होगा। आदेश में और अब & थे। सर्वर ने कचरा इकट्ठा नहीं किया था 2 साल से अधिक के लिए। कोई आश्चर्य नहीं कि यह यहाँ चारों ओर इतना बुरा गंध! – flickerfly

+0

तो यह ini_set के माध्यम से सेट की गई किसी भी चीज़ को पूरी तरह से छोड़ देता है? कोई आश्चर्य नहीं कि लिपि में सेटिंग जीसी कुछ भी नहीं करता है। – styks

2

मेरा सबसे अच्छा अनुमान यह होगा कि आप एक साझा सर्वर पर हैं और सत्र फ़ाइलों को सभी उपयोगकर्ताओं के साथ मिश्रित किया जाता है ताकि आप उन्हें न हटा सकें, न ही आपको हटाएं। यदि आप स्केलिंग और/या अपने उपयोगकर्ता सत्र गोपनीयता के बारे में चिंतित हैं, तो आप क्या कर सकते हैं, सत्रों को डेटाबेस में ले जाना है।

कुकी को डेटाबेस में लिखना प्रारंभ करें और समय के कारण होने पर आपको कई सर्वरों पर ऐप स्केल करने की दिशा में लंबा सफर तय हो गया है।

इसके अलावा मैं 145,000 फ़ाइलों के साथ ज्यादा चिंता नहीं करता।

+0

धन्यवाद फ्रेंकी, इसे डेटाबेस में ले जाने के बारे में अच्छा विचार, इसे ध्यान में रखेगा। – Jack

5

आप स्क्रिप्ट /etc/cron.hourly/php बना सकते हैं और वहाँ रख सकते हैं:

#!/bin/bash 

max=24 
tmpdir=/tmp 

nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete 

फिर स्क्रिप्ट निष्पादन योग्य बनाने के (chmod + x)।

अब 24 घंटे पहले संशोधित डेटा के साथ सभी सत्र फ़ाइलों को हटा दिया जाएगा।

19

मामले में किसी की एक cronjob के साथ ऐसा करना चाहते हैं, तो कृपया ध्यान रखें यह है कि:

find .session/ -atime +7 -exec rm {} \; 

वास्तव में धीमी है, जब फ़ाइलें का एक बहुत हो रही है।

इस बजाय उपयोग पर विचार करें:

find .session/ -atime +7 | xargs -r rm 

मामले में आप रिक्त स्थान है कि आपके पास फ़ाइल में नाम इस का उपयोग करें:

find .session/ -atime +7 -print0 | xargs -0 -r rm 

xargs फाइलों के साथ कमांडलाइन भर जाएगा हटाए जाने के लिए है, तो चलाने rm-exec rm {} \; से बहुत कम कमांड, जो प्रत्येक फ़ाइल के लिए rm कमांड को कॉल करेगा।

बस मेरे दो सेंट

+0

यह भी ध्यान रखें कि आप '-exec $ cmd {} +' 'exex $ cmd {} \; के बजाय' -exec $ cmd {} +; का उपयोग कर सकते हैं; यह एक आदेश के भीतर एक बार आदेश चलाने के बजाए एक कमांड में पाए गए सभी फ़ाइलों को निष्पादित करेगा प्रत्येक फाइल मिली। यह xargs के समान ही है क्योंकि 'एंडी' की सिफारिश की गई है। इसके बारे में यहां और पढ़ें: https://unix.stackexchange.com/questions/195939/what-is-meaning-of-in-finds-exec-command – domdambrogia

3
# Every 30 minutes, not on the hour<br> 
# Grabs maxlifetime directly from \`php -i\`<br> 
# doesn't care if /var/lib/php5 exists, errs go to /dev/null<br> 

09,39 * * * * find /var/lib/php5/ -type f -cmin +$(echo "\`php -i|grep -i session.gc_maxlifetime|cut -d' ' -f3\`/60" | bc) -exec rm -f {} \\; >/dev/null 2>&1 

ब्रेकडाउन: केवल फाइलें: खोज/var/lib/PHP5/प्रकार च
मिनट से अधिक पुराने: -cmin
जाओ php सेटिंग्स : $ (गूंज "` php मैं | ग्रेप मैं session.gc_maxlifetime
गणित कार्य करें: | -d कटौती '' -f3`/60 "| ईसा पूर्व) 0,123, आरएम मिलान फाइलें: -exec rm -f {} \; क्रॉन नीचे

0

उपयोग:

39 20  * * *  root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm 
0

सीडी सत्र निर्देशिका के लिए और फिर:

1) देखें सत्र से अधिक उम्र के 40 मिनट: find . -amin +40 -exec stat -c "%n %y" {} \;

2) निकालें सत्र से अधिक उम्र के 40 न्यूनतम: find . -amin +40 -exec rm {} \;

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