إنشاء مجلد في PHP إذا لم يكن موجودًا: أفضل 5 طرق في 2025

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

إنشاء مجلد في 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

لذلك، النهج الحديث هو دائمًا التحقق والتكرار والتحكم في الصلاحيات.

\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
\n\n

العيب: هذا الكود غير محمي من حالة السباق. إذا قام طلبان بالتحقق من is_dir() في نفس الوقت وحاول كلاهما إنشاء المجلد، فسيؤدي الثاني إلى ظهور تحذير.

\n\n

الطريقة 2: النهج الصناعي مع @mkdir() والتحقق من الأخطاء

\n\n

غالبًا ما يستخدم المطورون ذوو الخبرة عامل كبت الأخطاء @ ثم يتحققون صراحة من النتيجة.

\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
\n\n

تنبيه: العامل @ يقلل الأداء، لأن PHP لا يزال يولد الخطأ ولكنه يخفيه. في المشاريع عالية التحميل، من الأفضل استخدام الطريقة 3.

المدونات

توصيات الكتب