Php में संग्रहीत अस्थायी फ़ाइलों को साफ करने का सही तरीका क्या है?

Dec 01 2020

मैं php का उपयोग करके अपने अस्थायी भंडारण स्थान को साफ करने का एक तरीका निकालने की कोशिश कर रहा हूं। मुझे पता है कि मैं क्रॉन जॉब सेटअप कर सकता हूं, लेकिन क्या इसे php से ही करने का कोई तरीका है?

मैं डाउनलोड करने के लिए उपयोगकर्ता के लिए उत्पन्न पीडीएफ फाइलों को संग्रहीत करने के लिए एक अस्थायी भंडारण फ़ोल्डर का उपयोग करता हूं। मैं फ़ाइल पर एक समाप्ति को मजबूर करने में कामयाब रहा हूं, इसलिए यह 3 मिनट के बाद उपयोग करने के लिए सार्वजनिक रूप से उपलब्ध नहीं होगा। अब मुद्दा। हालाँकि फ़ाइल सार्वजनिक रूप से उपलब्ध नहीं है, फिर भी यह मेरे सर्वर में संग्रहीत है। मैंने स्टोरेज को साफ करने के लिए कुछ इस तरह कोडित किया है।

/** from the main thread */
if (rand(1, 100) <= 5) {
    Reports::clean();
}

/** the clean function */
public static function clean()
{
    $path = static::getStoragePath(); if($dir_handle = opendir($path)) { while (($fileName = readdir($dir_handle)) !== false) { $file = $path . '/' . $fileName;
            
            if (!is_file($file)) continue; // If file is older that 3 minutes delete it if (time() - filemtime($file) > static::$expires) { unlink($file);
            }
        }
        closedir($dir_handle);
    }
}

तो इससे स्टोरेज अनियमित रूप से साफ हो जाएगा। अधिकतर यह ठीक है। लेकिन मुद्दा यह है कि जब भंडारण की सफाई शुरू होती है तो कछुए की तरह यह अनुरोध धीमा हो जाता है।

इसलिए मैंने क्रोनजोब बनाने की सोची। लेकिन क्या php से ही ऐसा करने का एक सही तरीका है?

नोट: मैं स्लिम -4 का उपयोग कर रहा हूं, क्रोनोजर को स्थापित करने में भी ज्यादा विशेषज्ञता नहीं है। तो कोई भी संसाधन भी सहायक होगा

जवाब

3 MarcinJóźwikowski Dec 01 2020 at 17:04

संक्षिप्त उत्तर: नहीं।

PHP में किसी भी कार्रवाई को स्वयं ट्रिगर करने का कोई तरीका नहीं है।

एक स्क्रिप्ट बनाएं (या एक कमांड अगर यह एक रूपरेखा है) और इसे क्रोनजोब के साथ ट्रिगर करें।

2 MarkusAO Dec 01 2020 at 17:23

आपके कार्यान्वयन में, जब भी क्लीन-अप रूटीन मुख्य धागे से टकराता है, तो आपकी पीडीएफ निर्देशिका में फाइलों की मात्रा के आधार पर, यह प्रतिक्रिया में एक महत्वपूर्ण अंतराल पैदा कर सकता है।

जैसा कि अन्य टिप्पणियों / उत्तरों में उल्लेख किया गया है, एक क्रॉन जॉब वास्तव में इसे संभालने के लिए "मानक" तरीका होगा। हालाँकि, यदि आपके पास क्रॉन जॉब्स तक पहुंच नहीं है, या बस एक शुद्ध PHP समाधान पसंद करते हैं, तो संभावित दृष्टिकोणों के एक जोड़े हैं, एक तरफ जो पहले से ही कर रहे हैं।

  1. एक निर्मित टाइमस्टैम्प के साथ बनाई गई फ़ाइलों का एक लॉग रखें। जब क्लीन रूटीन कहा जाता है, तो संशोधित समय जांच के साथ एक पूर्ण निर्देशिका स्कैन करने के बजाय, अपने रिकॉर्ड के आधार पर हटाएं, और रिकॉर्ड से हटाए गए प्रविष्टियों को शुद्ध करें। एक JSON फ़ाइल के रूप में या CSV / TSV के रूप में अपने रिकॉर्ड को संग्रहीत करें। यह उन मामलों में एक महत्वपूर्ण गति प्रदान करता है जहां फाइलों की एक महत्वपूर्ण मात्रा होती है, जिसे फाइल सिस्टम एक्सेस में कमी दी जाती है।

  2. यदि आप अपने उपयोगकर्ताओं को क्लीन-अप लैग के साथ परेशान नहीं करना चाहते हैं, तो उपयोगकर्ता-सामना करने वाली फ़ाइलों से रूटीन को केवल-व्यवस्थापक फ़ाइलों में स्थानांतरित करें, या एक व्यवस्थापक उपयोगकर्ता की जाँच करें, और क्लीन-अप आवृत्ति ट्रिगर को समायोजित करें (ओपी के साथ) 1:20) व्यवस्थापक उपयोग की आवृत्ति से मेल खाने के लिए। यह बेशक क्लीन-अप फ़्रीक्वेंसी को कम कर सकता है (यदि प्रवेश आस-पास नहीं हैं), लेकिन लोड को जनता से दूर ले जाएगा।

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

TomiL Dec 01 2020 at 21:55

यह एक बुरा अवधारणा है, इस काम के लिए क्रोनजॉब शेड्यूलर का उपयोग करें। फ़ोल्डर / tmp / some_path में सभी फ़ाइलों को हटाने के लिए यहाँ bash oneliner है यदि फ़ोल्डर सामग्री 10MB से अधिक है (कृपया अपनी आवश्यकताओं के अनुसार संशोधित करें):

SIZE=$(du -bs --block-size=1M /tmp/some_path | cut -f1); if [[ $SIZE -gt 10 ]];then echo "Folder '/tmp/some_path' has size ($SIZE MB)."; rm -r /tmp/some_path/*; fi

आप इस कोड अतीत कर सकते हैं script.sh (शामिल कुटिया । बैश के लिए उदाहरण के लिए #!/bin/bashऊपर और मेकअप फ़ाइल निष्पादन योग्य यानी पर। chmod +x script.sh), तो cronjob अनुसूचक (जैसे करने के लिए संलग्न नई लाइन crontab -e) के लिए हर घंटे के आकार फ़ोल्डर की जाँच :

0 * * * * <path_to_the_script>/script.sh

आप cronjobs के बारे में अधिक जानकारी यहाँ पा सकते हैं: https://crontab.guru