PHP स्टोर फाइल को अस्थायी स्थान पर क्यों रखता है और इससे क्या लाभ होता है?




file-upload (3)

दो अतिरिक्त कारण:

  1. यदि आप किसी कारण से फ़ाइल को स्वीकार नहीं करने का निर्णय लेते हैं, तो यह एक अस्थायी स्थान पर संग्रहीत है और संभवतः किसी बिंदु पर स्वचालित रूप से हटा दिया जाएगा।

  2. सुरक्षा। मान लीजिए कि PHP वेब-सुलभ निर्देशिका जैसे / छवियों को अपलोड करने के लिए सेट किया गया था। कोई किसी प्रकार की हैकिंग फ़ाइल अपलोड कर सकता है और फिर उसे निष्पादित कर सकता है। पहले एक अस्थायी निर्देशिका में फ़ाइलें डालकर (जो आमतौर पर वेब-सुलभ नहीं होगी), PHP आपको पहले फ़ाइल की जांच करने देता है। उदाहरण के लिए, किसी भी टिप्पणी को हटाने के लिए छवियों को संसाधित करके, जिसमें PHP कोड हो सकता है।

ठीक है, मैं इस क्षेत्र में पूरी तरह से नया हूं और कुछ ट्यूटोरियल से गुजर रहा हूं और मैंने पाया कि PHP में फाइलें अपलोड करते समय यह उन्हें एक अस्थायी स्थान पर संग्रहीत करता है।

$file_temp=$_FILES['file']['tmp_name'];
$file_loc="Upload".$file_name;
move_uploaded_files($file_temp,$file_loc);

अब PHP सीधे वांछित स्थान पर फाइलें अपलोड करने की अनुमति क्यों नहीं देता है? उन्हें एक .tmp एक्सटेंशन के साथ एक अस्थायी स्थान में क्यों संग्रहीत किया जाता है और इस रणनीति से हमें क्या लाभ मिलता है?


एक अस्थायी स्थान पर लिखने का क्या लाभ है, और फिर इसे इच्छित गंतव्य पर कॉपी करना है? :

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

अच्छा प्रश्न। संक्षिप्त उत्तर यह है कि PHP को आपकी स्क्रिप्ट पर नियंत्रण देने से पहले संपूर्ण HTTP अनुरोध - डेटा के साथ $_POST और आवश्यकतानुसार $_FILES को संसाधित करना होगा। चूंकि आपकी स्क्रिप्ट प्रसंस्करण के बाद नियंत्रण प्राप्त नहीं करती है, इसलिए PHP को यह बताने का कोई तरीका नहीं है कि उस फ़ाइल डेटा को कहाँ रखा जाए।

लेकिन PHP इसे इस तरह से क्यों करता है? ठीक है, चलो फ़ाइल डेटा के साथ एक HTTP POST को देखें :

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

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

इसलिए, यह गारंटी देने के लिए कि PHP आपको सभी $_POST डेटा दे सकती है, PHP को पूरे अनुरोध को संसाधित करना होगा। तो यह $_FILES सुपर-ग्लोबल होते हुए भी पूरा हो सकता है।

अब, PHP इस फ़ाइल डेटा को स्मृति में रख सकती है , लेकिन यह वास्तव में एक बुरा विचार हो सकता है। सोचो कि क्या होगा अगर PHP को एक उपयोगकर्ता द्वारा अपलोड किए गए 100 MiB फ़ाइल को स्टोर करने की आवश्यकता होती है। अचानक, आपको अपनी Apache प्रक्रिया के RSS में 100 MiB वृद्धि मिल गई है, जो वास्तव में बहुत अच्छी नहीं है - Apache के लिए ulimit एड हो सकता है कि ज्यादा जगह न हो, या Apache को स्वैप किया जा सके: आपके उपयोगकर्ताओं की पीड़ा के लिए। तो, PHP अगली सबसे अच्छी बात करता है: इस प्राप्त फ़ाइल को एक अस्थायी फ़ाइल में डालें।

आप पूछ सकते हैं कि PHP को क्यों नहीं बताया जा सकता है कि आने वाली फ़ाइल डेटा को पहले किस फ़ाइल में डाला जाए, इसलिए आपको इसे स्थानांतरित करने की आवश्यकता नहीं थी। खैर, यह एक बूटस्ट्रैपिंग समस्या है: PHP ने अभी तक स्क्रिप्ट पर नियंत्रण नहीं दिया है, इसलिए स्क्रिप्ट PHP को यह नहीं बता सकती है कि फ़ाइल कहाँ रखी जाए। इस प्रकार, PHP यह सबसे अच्छा करता है: फ़ाइल डेटा को एक अस्थायी फ़ाइल में डाल दिया।

अब, आप इस फ़ाइल डेटा को रैम डिस्क में रख सकते हैं, यदि आप चाहें तो गति के लिए। यदि आप बुनियादी ढांचे की लागत (जैसे रैम डिस्क सेटअप को बनाए रखना) को बुरा नहीं मानते हैं तो यह एक अच्छा तरीका है। लेकिन ध्यान दें कि यह PHP को RAM में रखने जैसा नहीं है: उस परिदृश्य में, PHP कंटेनर प्रक्रिया (आमतौर पर Apache या कुछ अन्य वेब सर्वर) में फ़ाइल को रखने के लिए ढेर होना चाहिए (जो यह नहीं हो सकता है)। इस परिदृश्य में, RAM डिस्क को कर्नेल द्वारा प्रबंधित किया जाता है।







file-upload