PHP में फोल्डर न हो तो बनाएं: 2025 के लिए बेस्ट प्रैक्टिसेज

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

«Create a folder if it doesn't already exist»: 2025 में पहिया का पुनः आविष्कार कैसे न करें

\n\n

क्या आपने कभी ऐसी स्क्रिप्ट लिखी है जो फाइलों को सेव करती हो, और अचानक आपको Warning: mkdir(): No such file or directory एरर मिली हो? अगर हाँ, तो आप अकेले नहीं हैं। Stack Overflow पर «Create a folder if it doesn't already exist» सवाल के हजारों व्यूज हैं, और यह सही भी है। यह आसान लगता है, लेकिन व्यवहार में नए (और अनुभवी) डेवलपर्स अक्सर परमिशन, रिकर्सिव क्रिएशन और रेस कंडीशन जैसी समस्याओं में फंस जाते हैं।

\n\n

इस लेख में हम 2025 के लिए PHP में फोल्डर बनाने की बेस्ट प्रैक्टिसेज पर चर्चा करेंगे। आप सीखेंगे कि mkdir() का सही उपयोग कैसे करें, सामान्य गलतियों से कैसे बचें, और ऐसा मजबूत कोड कैसे लिखें जो कभी फेल न हो। चलिए शुरू करते हैं!

\n\n

«Create a folder if it doesn't exist» सवाल इतना लोकप्रिय क्यों है?

\n\n

हर दूसरा वेब प्रोजेक्ट किसी न किसी तरह फाइलों के साथ काम करता है: अवतार अपलोड करना, रिपोर्ट जनरेट करना, कैशिंग, लॉगिंग। और हर जगह यह सुनिश्चित करना ज़रूरी है कि टार्गेट डायरेक्ट्री मौजूद हो। अगर वह नहीं है, तो स्क्रिप्ट एरर देगी, यूज़र को «500 Internal Server Error» दिखेगा, और आप रात के तीन बजे बग ढूंढ़ रहे होंगे।

\n\n

समस्या यह है कि PHP का mkdir() फंक्शन अपने आप पैरेंट डायरेक्ट्री नहीं बनाता। कई डेवलपर्स कुछ इस तरह कोड लिखते हैं:

\n\n
if (!file_exists($path)) {\n    mkdir($path);\n}\n
\n\n

और यह काम करता है… जब तक race condition (रेस कंडीशन) न हो। अगर दो स्क्रिप्ट एक साथ फोल्डर की जांच करें और दोनों उसे बनाने की कोशिश करें, तो एक एरर देगा। 2025 में, जब वेबसाइटों पर लोड बढ़ रहा है, ऐसे बग गंभीर हो जाते हैं।

\n\n

PHP में mkdir() फंक्शन: पूरी जानकारी

\n\n

आइए इसकी सिग्नेचर याद करें:

\n\n
mkdir(string $directory, int $permissions = 0777, bool $recursive = false, resource $context = ?): bool\n
\n\n
    \n
  • $directory — बनाई जाने वाली फोल्डर का पथ।
  • \n
  • $permissions — एक्सेस परमिशन (डिफ़ॉल्ट 0777, लेकिन umask लागू होता है)।
  • \n
  • $recursive — अगर true है, तो सभी गायब पैरेंट डायरेक्ट्री भी बनाता है।
  • \n
  • $context — स्ट्रीम कॉन्टेक्स्ट (शायद ही उपयोग होता है)।
  • \n
\n\n

मुख्य रहस्य $recursive पैरामीटर है। अधिकांश समस्याएं इसी से हल हो जाती हैं। लेकिन चलिए क्रम से समझते हैं।

\n\n

आसान तरीका: is_dir() + mkdir()

\n\n

यह जांचने का सबसे स्पष्ट और सही तरीका कि फोल्डर मौजूद है या नहीं, is_dir() का उपयोग करना है, न कि file_exists() का। क्यों? क्योंकि file_exists() उसी नाम की फाइल के लिए भी true लौटाएगा, जिससे एरर होगी।

\n\n
$dir = '/path/to/upload';\n\nif (!is_dir($dir)) {\n    mkdir($dir, 0755, true);\n}\n
\n\n

यहाँ हम:

\n
    \n
  • जांचते हैं कि डायरेक्ट्री मौजूद नहीं है और फाइल नहीं है।
  • \n
  • फोल्डर को 0755 परमिशन के साथ बनाते हैं (मालिक सब कुछ कर सकता है, बाकी पढ़ और एक्ज़ीक्यूट कर सकते हैं)।
  • \n
  • रिकर्सिव क्रिएशन के लिए true का उपयोग करते हैं — अगर पैरेंट फोल्डर /path/to मौजूद नहीं है, तो वह भी बन जाएगा।
  • \n
\n\n

यह तरीका 90% मामलों में काम करता है। लेकिन क्या होगा अगर दो रिक्वेस्ट एक साथ यह कोड चलाएं?

\n\n

Race condition (रेस कंडीशन) से बचाव

\n\n

हाई-लोड सिस्टम में, दो स्क्रिप्ट एक साथ फोल्डर बनाने की कोशिश कर सकती हैं। एरर से बचने के लिए, @ (एरर सप्रेशन) का उपयोग करें या, बेहतर होगा, mkdir() के रिजल्ट की जांच करें:

\n\n
$dir = '/path/to/cache';\n\nif (!is_dir($dir)) {\n    // बनाने की कोशिश करें। अगर दूसरी प्रक्रिया ने पहले ही बना लिया, तो कोई बात नहीं\n    if (!mkdir($dir, 0755, true) && !is_dir($dir)) {\n        throw new \\RuntimeException('डायरेक्ट्री बनाने में विफल: ' . $dir);\n    }\n}\n
\n\n

यह कोड पहले जांचता है कि डायरेक्ट्री मौजूद है या नहीं। अगर नहीं है, तो बनाने की कोशिश करता है। अगर mkdir() विफल होता है (क्योंकि किसी और ने बना दिया), तो दोबारा जांचता है कि डायरेक्ट्री अब मौजूद है या नहीं। अगर नहीं है, तो एरर फेंकता है। यह रेस कंडीशन को सुरक्षित रूप से हैंडल करता है।

ब्लॉग

पुस्तक अनुशंसाएँ