إنشاء مجلد في PHP إذا لم يكن موجودًا: تطور سؤال واحد
\n\nإذا كنت قد كتبت يومًا نصًا برمجيًا لتحميل الملفات، أو حفظ ذاكرة التخزين المؤقت، أو إنشاء تقارير، فمن المؤكد أنك واجهت موقفًا: "المجلد غير موجود!". خطأ يوقف النص البرمجي بأكمله، ويرى المستخدم شاشة بيضاء أو (ما هو أسوأ) خطأ PHP غير مفهوم.
\n\nسؤال "Create a folder if it doesn't already exist" على Stack Overflow يجمع آلاف المشاهدات. وليس من دون سبب. يبدو الأمر بسيطًا؟ لكن الشيطان، كما هو الحال دائمًا، في التفاصيل: صلاحيات الوصول، التكرار، معالجة الاستثناءات، ترميز اسم المجلد. في عام 2025، عندما تصبح المشاريع أكثر تعقيدًا ومتطلبات الأمان أكثر صرامة، فإن الإنشاء الصحيح للدلائل هو الأساس الذي يجب أن يعرفه كل مطور PHP.
\n\nفي هذه المقالة، سنستعرض أفضل 5 ممارسات لإنشاء مجلد في PHP إذا لم يكن موجودًا. من حل بسيط للمبتدئين إلى كود صناعي مع حماية من حالة السباق (race condition). هيا بنا!
\n\nلماذا mkdir() البسيط سيء؟ (قصة خطأ واحد)
\n\nفي البداية، يكتب الكثيرون هكذا:
\n\n<?php\nmkdir('/path/to/my/folder');\n?>\n\nويحصلون على:
\n\n- \n
- Warning: mkdir(): No such file or directory — إذا كان المجلد الأصلي غير موجود. \n
- Warning: mkdir(): File exists — إذا كان المجلد موجودًا بالفعل. \n
كلا التحذيرين ليسا مجرد "نص أصفر". في وضع الإنتاج، يمكن أن يتحولا إلى أخطاء قاتلة إذا كان وضع الإبلاغ عن الأخطاء صارمًا. كما أنها ثغرة أمنية: يمكن للمهاجم إنشاء مجلد بنفس الاسم قبل نصك البرمجي (حالة سباق).
\n\nلذلك، النهج الحديث هو دائمًا التحقق والتكرار والتحكم في الصلاحيات.
\n\nالطريقة 1: الطريقة الكلاسيكية مع is_dir() و mkdir() (للمبتدئين)
\n\nأبسط وأوضح طريقة هي التحقق أولاً مما إذا كان المجلد موجودًا، ثم إنشاؤه.
\n\n<?php\n$folder = '/var/www/uploads/images';\n\nif (!is_dir($folder)) {\n mkdir($folder, 0755, true);\n echo "تم إنشاء المجلد!";\n} else {\n echo "المجلد موجود بالفعل.";\n}\n?>\n\nما هو المهم هنا:
\n- \n
is_dir()— ترجع true إذا كان المسار موجودًا وهو دليل. \n mkdir($folder, 0755, true)— المعامل الثالثtrueيفعل الإنشاء المتكرر. إذا لم يكن المجلد الأصلي موجودًا، سيقوم PHP بإنشاء السلسلة بأكملها (/var/www/uploads/images← سينشئuploads، ثمimages). \n 0755— صلاحيات الوصول: المالك يمكنه فعل كل شيء، والآخرون يمكنهم القراءة والتنفيذ. \n
العيب: هذا الكود غير محمي من حالة السباق. إذا قام طلبان بالتحقق من is_dir() في نفس الوقت وحاول كلاهما إنشاء المجلد، فسيؤدي الثاني إلى ظهور تحذير.
الطريقة 2: النهج الصناعي مع @mkdir() والتحقق من الأخطاء
\n\nغالبًا ما يستخدم المطورون ذوو الخبرة عامل كبت الأخطاء @ ثم يتحققون صراحة من النتيجة.
<?php\n$folder = '/var/www/uploads/images';\n\nif (!is_dir($folder)) {\n // كبت التحذير إذا كان المجلد موجودًا بالفعل\n if (!@mkdir($folder, 0755, true) && !is_dir($folder)) {\n throw new \\RuntimeException('فشل إنشاء المجلد: ' . $folder);\n }\n}\n?>\n\nلماذا هذا أفضل؟
\n- \n
- نحن نكبت التحذير، لكننا لا نتجاهل الخطأ — إذا فشل الإنشاء، يتم طرح استثناء. \n
- التحقق المزدوج
!is_dir($folder)بعدmkdir()يحمي من حالة السباق: إذا قامت عملية أخرى بإنشاء المجلد بين فحصنا واستدعاءmkdir()، فلن نتعطل. \n
تنبيه: العامل @ يقلل الأداء، لأن PHP لا يزال يولد الخطأ ولكنه يخفيه. في المشاريع عالية التحميل، من الأفضل استخدام الطريقة 3.