بيت / نظرة عامة على لينكس / يعمل PHP - قم بإنشاء مجلد إذا لم يكن موجودًا بالفعل. وظيفة Mkdir في PHP، وصف وأمثلة لإنشاء مجلد PHP في حالة عدم وجوده

يعمل PHP - قم بإنشاء مجلد إذا لم يكن موجودًا بالفعل. وظيفة Mkdir في PHP، وصف وأمثلة لإنشاء مجلد PHP في حالة عدم وجوده

تقوم الدالة mkdir() بإنشاء مجلد جديد في الدليل المحدد. إذا كان الإنشاء ناجحًا، فسيتم إرجاع True. عند إنشاء مجلد جديد، يمكنك تعيين حقوق الوصول إليه باستخدام المعلمة $mode. من خلال تعيين $recursive على True، يمكنك إنشاء مجلدات فرعية متعددة.

PHP الإصدار 4 وما فوق.

وظيفة منطقية mkdir(سلسلة $pathname [، int $mode [، bool $recursive [، المورد $context]]])

معلمات وظيفة مكدير

اسم المسار $المسار إلى الدليل المراد إنشاؤه.
وضع $يتم تعيين حقوق المجلد الذي تم إنشاؤه كقيمة ثماني بصفر إلزامي في المقام الأول (0777). وبصرف النظر عن الصفر الأول، تمثل الأرقام مستويات الوصول للمالك ومجموعة المالك وأي شخص آخر.
يتم تحديد مستوى الوصول من خلال الأرقام:
0 - تم رفض الوصول؛
1 – الوصول للقراءة.
2 – الوصول للكتابة.
4 – الوصول إلى التنفيذ .
في أغلب الأحيان، يتم تحديد الحقوق كمبلغ مركب، على سبيل المثال:
7 – الوصول الكامل (1+2+4);
5- القراءة والتنفيذ (1+4).
القيمة الافتراضية هي 0777.
$ عوديمعلمة منطقية تحدد ما إذا كان يمكن إنشاء الدلائل الفرعية المتداخلة.
سياق $تستخدم عند العمل مع التدفقات. تمت الإضافة في PHP 5.0.0.

أمثلة على استخدام الدالة mkdir

مكدير( "مجلد جديد")؛

مكدير( "../مجلد جديد")؛ // مستوى واحد للأسفل

mkdir("/folder1/folder2/newfolder" ); // المسار الكامل

مكدير( "مجلد جديد"، 0777)؛ // قم بإنشاء مجلد بالحقوق المعينة

إذا كنت بحاجة إلى إنشاء مجلدات فرعية متعددة، فستحتاج إلى تعيين $recursive = True.

mkdir("folder1/folder2/newfolder" , 0777, True ); // إنشاء مجلد في الدليل الحالي


لا يُسمح بنشر هذه المقالة إلا مع رابط إلى الموقع الإلكتروني لمؤلف المقالة

سأصف في هذه المقالة خيارًا واحدًا للتغلب على مشكلة إنشاء المجلدات باستخدام PHPفي الوضع الآمن.
لإنشاء مجلد في PHP، هناك وظيفة mkdir() قياسية، ولكن في معظم الحالات يتبين أنها عديمة الفائدة ويعرف الكثير من الأشخاص عنها، ولكن لا يعرف الكثير من الأشخاص أنه يمكنك التغلب على هذه المشكلة.
كل شيء بسيط للغاية، تحتاج إلى إنشاء مجلدات باستخدام البرنامج المدمج وظائف PHPبروتوكول نقل الملفات.
أدناه أكتب عن هذا بمزيد من التفصيل.

مشاكل مع mkdir() عند إنشاء مجلد.
كما تعلم، إذا تم تمكينه في php الوضع الآمن(safe_mode = on)، فلن ينجح إنشاء مجلدات (أدلة) باستخدام mkdir(). لكي نكون أكثر دقة، يمكنك إنشائه، ولكن الاستخدام الإضافي لهذا المجلد سيكون مستحيلا. لن تتمكن من تحميل الملفات إلى هذا المجلد، ولن تتمكن من إعادة تسميته ولن تتمكن من حذفه، حتى لو قمت بتسجيل الدخول عبر FTP (في بعض الحالات يمكنك الحذف عبر FTP).

يتم تمكين الوضع الآمن بشكل افتراضي على كافة الخوادم وجميع موفري الاستضافة. إذا لم يكن لديك خيار تعطيل الوضع الآمن، فهناك طريقة أخرى للخروج.

إنشاء مجلدات في PHP باستخدام FTP.
تحتوي جميع الخوادم والاستضافة تقريبًا على دعم ftp ممكّن في php.
بمساعدة هذه الوظائف سوف نتغلب على مشكلة إنشاء المجلد mkdir().
مثال على إنشاء مجلد عبر FTP.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // الاتصال بخادم FTP
إذا($conn_id) // إذا كان الاتصال بالخادم ناجحًا، تابع
{
$login_result = @ftp_login($conn_id, "user", "pass"); // أدخل اسم المستخدم وكلمة المرور الخاصة بك لـ FTP
إذا($login_result) // إذا قبل الخادم كلمة مرور تسجيل الدخول، فانتقل
{
// الآن أنت بحاجة إلى اللعب بالوضع السلبي، أو تشغيله أو إيقافه (TRUE، FALSE)
// إذا كانت وظائف ftp الأخرى لا تعمل بشكل صحيح، فحاول تغيير هذه المعلمة (TRUE أو FALE)
ftp_pasv($conn_id, TRUE); // في هذه الحالة يتم تمكين الوضع السلبي
ftp_mkdir($conn_id, "1/2/3"); // وإنشاء المجلد نفسه
}
}
ftp_Close($conn_id); // وأغلق اتصال FTP
?>
الآن، ليس تعليقًا كبيرًا على الكود.
يتصل السطر الأول بخادم FTP. عادةً، للاتصال بخادم FTP محلي، يكفي تحديد مضيف محلي كخادم، ولكن يمكنك أيضًا تحديد العنوان الكامل.
يعتمد تمكين الوضع السلبي أو تعطيله على إعدادات FTP.

عند إنشاء مجلد، كن حذرًا، حيث يتم إنشاء المجلد من جذر تسجيل الدخول إلى FTP. أي أن المسارات هنا تختلف عن المسارات نظام الملفاتويتم إنشاء المجلد كما رأينا من خلال FTP.
إذا حددت عدة مرفقات عند إنشاء مجلد، كما في المثال الخاص بي "1/2/3"، ففي هذه الحالة سيتم إنشاء جميع المجلدات المفقودة. إذا لم يكن هناك مجلد "1" فسيتم إنشاؤه، وفيه سيتم إنشاء المجلد "2"، وفيه سيتم إنشاء المجلد "3". إذا كانت المجلدات المتوسطة موجودة بالفعل، فسيتم إنشاء المجلدات المفقودة فقط.
قبل إنشاء مجلد، يمكنك الانتقال إلى مجلد، على سبيل المثال


وبعد هذه الوظيفة يمكنك إنشاء مجلد. إذا تم تحديد المسار إلى المجلد كـ "2/3" بدون شرطة مائلة بادئة، فسيتم إنشاء المجلد نسبة إلى المجلد الذي نحن موجودون فيه حاليًا. أي أنه سيتم إنشاء المجلد "1/2/3".


إذا قمت بتحديد شرطة مائلة بادئة (/1/2/3) عند إنشاء مجلد، فسيتم إنشاء المجلد من جذر FTP، بغض النظر عن المجلد الذي انتقلت إليه.

تعليقات

14/10/2009 سيرجي
كل شيء عبقري بسيط :)

12.12.2009 فيكتور
شكرًا لك، كل شيء يعمل، ولكن في عميل ftp، لا تظهر المجلدات التي تم إنشاؤها على الفور، ويجب عليك إعادة تشغيله، على سبيل المثال. لا تقم فقط بقطع الاتصال بالخادم والاتصال مرة أخرى، ولكن أغلق البرنامج وقم بتشغيله مرة أخرى (أستخدم FileZilla Client).

14/12/2009 المشرف
أعتقد أن هذا كل شيء عملاء بروتوكول نقل الملفاتملفات ومجلدات ذاكرة التخزين المؤقت. على سبيل المثال، يوجد في Total Commander زر "تحديث" خاص لمثل هذه الأمور، ومن المؤسف أن FileZilla لا يحتوي على هذا الزر.

24/01/2010 الكسندر
كيف لا يوجد شيء من هذا القبيل في FileZilla، لدي الإصدار 3.2.2، وقد مضى عليه عام تقريبًا وهناك مثل هذه الوظيفة وبقدر ما أتذكر كانت موجودة دائمًا !!!

27/08/2010 فيتالي
يتم إنشاء المجلدات باستخدام 755 على اليمين، لكنك تحتاج إلى 777.
في مرحلة الإنشاء، هل من الممكن تكوين الحقوق التي سيتم إنشاء المجلد بها عبر FTP بطريقة أو بأخرى؟

08/27/2010 المشرف
فيتالي، هناك وظيفة لهذا
ftp_chmod($conn_id، 0777، ملف $)
بعد إنشاء مجلد أو ملف، استخدمه

28/08/2010 فيتالي
شكرا لك، المشرف!

12/09/2010 أندريه
عفواً، لماذا لا أقوم بإنشاء عدة أدلة، وهي:

12/06/2011 ايليا
هناك شيء لا يسير على ما يرام. مشاكل الخادم:
تحذير: يتوقع ftp_clus() أن تكون المعلمة 1 هي المورد، وهي منطقية مذكورة في /home/bos/p/h/p/phpscripts/public_html/formf.php في السطر 19

15/06/2011 فيكتور
إيليا، يكتب أن المعلمة الأولى التي تقوم بتمريرها إلى وظيفة ftp_Close غير صحيحة

29/06/2011 أليكسي
نفس مشكلة أندريه
(لم يتم إنشاء أدلة متعددة)
ftp_mkdir ($conn_id, "1"); // هذه هي الطريقة التي يعمل بها
ولكن بهذه الطريقة ftp_mkdir ($conn_id, "1/2/3"); // لا يعمل.
???

27/07/2011 فيكتور
أليكسي، غريب، لقد تحققت، فهو يقوم بإنشاء عدة مجلدات بالنسبة لي.
ربما تم تمكين بعض الأوضاع الصعبة على الخادم، فأنت بحاجة إلى إنشاء مجلدات واحدًا تلو الآخر، قم أولاً بإنشاء المجلد 1، ثم أدخله وأنشئ المجلد 2 فيه، ثم أدخل المجلد 2 وأنشئ 3 فيه...

07/11/2011 k1-801 (ديمتري ممكن)
ولحذف المجلدات، بقدر ما أفهم، من خلال
rmdir_ftp($conn_id, $dir);
لذا؟

وبالمناسبة، لسبب ما، لا يُنشئ مجلدًا لي (ولا يكتب أخطاء... غريب...)

10/03/2012 ي
شكرا لك، وإلا فقد تعذبت بهذا السؤال.
وأنت تسامح كل شيء والشيء الرئيسي هو أنه يعمل

29/05/2012 ميخائيل
بالطبع أنا آسف. أين يجب أن أكتب هذا الرمز، وإلا فأنا لست جيدًا فيه على الإطلاق، لكني بحاجة حقًا إلى إنشاء مجلد))

07/04/2012 نوماق
هناك خطأ ما معي... في المرة الأولى التي يتم فيها تخطي الرمز، وفي المرة الثانية يقول أن هذا المجلد موجود بالفعل... يبدو أنه يتم إنشاؤه، لكنه غير مرئي حتى بعد إعادة تشغيل FTP((((
وأيضًا، أحتاج إلى إنشاء مجلد ليس في نفس المجلد الذي يوجد به ملف PHP، ولكن الرجوع خطوة واحدة، ثم إدخال مجلد آخر وإنشاءه هناك.. شيء من هذا القبيل:
../folder1/مجلد جديد هنا
الرجاء المساعدة، إذا لم يكن من الصعب) شكرا لك)

07/04/2012 نوماق
لقد اكتشفت الطرق))) شكرًا بشكل عام على المقالة، ومن النادر أن يشرح أحد الطريقة بشكل صحيح)))

27/01/2013 سيليز
أحسنت، احتراما للمقال

05/06/2013 فاسيلي
مجلد الشركة هو العنصر الرئيسي هوية الشركةشركات. إنه منتج لإرفاق كميات صغيرة من المستندات والمواد الورقية. يتم استخدام المجلدات داخل الشركة لتخزين الوثائق ونقلها ولأغراض إعلانية. مزيد من التفاصيل على الموقع: www.logodesigner.ru/papki

إزالة العلامات (12)

لقد واجهت العديد من الحالات مع عمليات تثبيت WordPress من Bluehost حيث واجهت أخطاء في سمة WordPress الخاصة بي لأن مجلد التحميلات wp-content/uploads كان مفقودًا.

من الواضح أن برنامج تثبيت Bluehost cPanel WP لا يقوم بإنشاء هذا المجلد، على الرغم من قيام HostGator بذلك.

لذلك أحتاج إلى إضافة رمز إلى السمة الخاصة بي يتحقق من المجلد ويقوم بإنشائه بطريقة أخرى.

الإجابات

جرب هذا:

إذا (!file_exists("path/to/directory")) ( mkdir("path/to/directory", 0777, true); )

لاحظ أن 0777 هو بالفعل الوضع الافتراضي للأدلة ولا يزال من الممكن تغييره بواسطة umask الحالي.

يحتوي WordPress أيضًا على وظيفة مفيدة جدًا wp_mkdir_p والتي ستقوم بإنشاء بنية دليل بشكل متكرر.

المصدر كمرجع:-

الدالة wp_mkdir_p($target) ( $wrapper = null; // تجريد البروتوكول if(wp_is_stream($target)) ( list($wrapper, $target) =تفجير("://", $target, 2);) // من مستخدم php.net/mkdir ساهم بالملاحظات $target = str_replace("//"، "/"، $target); // ضع الغلاف مرة أخرى على الهدف if($wrapper !== null) ( $target ); = $wrapper . "://" . $target; ) // يفشل الوضع الآمن بشرطة مائلة زائدة ضمن إصدارات PHP معينة. if (empty($target)) $target = "/"; if (file_exists($target)) أرجع @is_dir($target); " != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // احصل على بتات الإذن. if ($stat = @stat($target_parent)) ( $dir_perms = $stat[ "mode"] & 0007777; ) else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // إذا تم تعيين umask لتعديل $dir_perms، فسنضطر إلى إعادة- اضبط $dir_perms بشكل صحيح باستخدام chmod() if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts =تفجير( "/"، substr($target, strlen($target_parent) + 1));<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

لـ ($i = 1؛ $i

أحتاج إلى نفس الشيء لموقع تسجيل الدخول. كنت بحاجة لإنشاء دليل بمتغيرين. الدليل $ هو المجلد الرئيسي الذي أردت إنشاء مجلد فرعي آخر به رقم ترخيص المستخدم.

Include_once("../include/session.php"); $lnum = $session->lnum; // رقم ترخيص المستخدمين من الجلسات $directory = upload_labels; // اسم الدليل الذي سيتم إنشاء هذا المجلد فيه if (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

شيء أكثر عمومية كما يظهر على جوجل. في حين أن التفاصيل أكثر تحديدا، فإن عنوان هذا السؤال أكثر عمومية.

/** * إنشاء مسار دليل طويل بشكل متكرر */ function createPath($path) ( if (is_dir($path)) return true; $prev_path = substr($path, 0, strrpos($path, "/", - 2) + 1); $return = createPath($prev_path); return ($return && is_writable($prev_path)) ?

يمكن تحسينه من خلال توفير مستوى توقف بحيث يفشل فقط إذا خرج خارج مجلد المستخدم أو شيء من هذا القبيل، وتمكين الأذونات.

لإنشاء مجلد إذا لم يكن موجودًا بالفعل

النظر في القضية البيئية.

  • ووردبريس.
  • خادم استضافة الويب.
  • بافتراض أن Linux لا يقوم بتشغيل PHP.

منطقي mkdir(string $pathname[, int $mode=0777[, bool $recursive=FALSE[, Resources$context]]])

ينص الدليل على أن المعلمة الوحيدة المطلوبة هي $pathname !

حتى نتمكن ببساطة من ترميز:

توضيح:

لا نحتاج إلى تمرير أي معلمة أو التحقق من وجود المجلد أو حتى معلمة وضع النقل إذا لزم الأمر؛ للأسباب التالية:

  • سيقوم الأمر بإنشاء مجلد بإذن 0755 (الإذن الافتراضي لمجلد عام) أو 0777، الإذن الافتراضي للأمر.
  • يتم تجاهل الوضع في مضيف Windows يقوم بتشغيل PHP .
  • يحتوي الأمر mkdir على فحص مضمن لمعرفة ما إذا كان المجلد موجودًا؛ لذلك نحتاج فقط إلى التحقق من إرجاع True | خطأ شنيع؛ وهذا ليس خطأ، إنه تحذير فقط، ويتم تعطيل التحذير على خوادم الاستضافة افتراضيًا.
  • اعتمادًا على السرعة، يكون أسرع إذا تم تعطيل التحذير.

هذه طريقة أخرى للنظر إلى السؤال وعدم المطالبة بالحل الأفضل أو الأمثل.

تم اختباره على PHP7، خادم الإنتاج، Linux

يمكنك أيضًا تجربة:

$dirpath = "المسار/إلى/دير"; وضع $ = "0777"; is_dir($dirpath) || mkdir($dirpath, $mode, true);

إذا (!is_dir("path_directory")) ( @mkdir("path_directory"); )

طريقة أسرع لإنشاء مجلد:

إذا (!is_dir("path/to/directory")) ( mkdir("path/to/directory", 0777, true); )

سوف تفعل

برينتف("مرحبًا %s،
"، $الاسم)؛

قبل التثبيت ملفات تعريف الارتباط، وهو محظور. لا يمكنك إرسال أي بيانات قبل الرؤوس، ولا حتى سطرًا فارغًا.

لدى PHP وظيفة واحدة - mkdir()، والتي تسمح لك بإنشاء أدلة على خادم موقع الويب، والتي تكون في بعض الأحيان ضرورية جدًا في المنزل. على سبيل المثال، عند إنشاء مادة جديدة، تحتاج إلى إنشاء مجلد لها، حيث ستقوم مرة أخرى باستخدام نظام إدارة المحتوى (CMS) الخاص بك بتحميل جميع الملفات الضرورية.

Mkdir("/path/to/my/dir", 0700);

أولئك. في دليل معين، نقوم بإنشاء مجلد جديد، على سبيل المثال، ضبط وضعه على الوضع 0700، على سبيل المثال، لكي نتمكن من كتابة الملفات إلى المجلد، نقوم بتغيير الوضع إلى 0777.

ولكن هذا هو المكان الذي تنشأ فيه مشكلة mkdir(). عند القيام بذلك PHP البرنامج النصيعند تمكين وظيفة خادم الوضع الآمن، يتم تحديد المالك (UID) وإذا كان مالك البرنامج النصي والمجلد غير متطابقين، فقد لا تتمكن، على سبيل المثال، من كتابة ملف إلى الدليل الذي تم إنشاؤه، وحذف ملف الملف الموجود فيه، أو، على سبيل المثال، عبر FTP، لن تتمكن من حذف المجلد نفسه.

ولكن هناك حل أكثر أناقة لهذه المشكلة، دون الحاجة إلى مطالبة المضيف بتعطيل وظيفة الوضع الآمن نيابةً عنك (يتم تمكين هذه الوظيفة على جميع مواقع الاستضافة بشكل افتراضي، من أجل ضمان الأمان). في الأساس، توفر خدمات الاستضافة المدفوعة أيضًا إمكانية الوصول إلى بروتوكول نقل الملفات، وهذا ما سنبدأ منه.

$conn_ftp = @ftp_connect("your_ftp_server", 21, 5);

المتغير الأول في الوظيفة هو عنوان خادم ftp الخاص بك، والثاني هو المنفذ الذي تتصل به بـ ftp والأخير هو مهلة الاتصال المسموح بها. قليلاً عن المهلة، فهي ضرورية لعمليات الشبكة اللاحقة؛ إذا لم تقم بإدخالها، فسيتم تعيين القيمة الافتراضية على 90 ثانية. بعد الاتصال نتحقق من نجاحه ونرسل تسجيل الدخول وكلمة المرور:

إذا($conn_ftp) // كان الاتصال ناجحًا ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // أدخل معلومات تسجيل الدخول وكلمة المرور الخاصة بك لـ FTP if($login_result) // تم التحقق من تسجيل الدخول وكلمة المرور النجاح (ftp_pasv($conn_ftp, TRUE);))

بعد التحقق من تسجيل الدخول وكلمة المرور، نحتاج إلى تحديد الوضع السلبي وضبطه على TRUE أو FALSE - وهذا ضروري إذا لم تعمل وظائف FTP الأخرى بشكل صحيح. الآن بعد تحديد الوضع السلبي، يمكننا إنشاء مجلداتنا، وسوف أصف جميع الوظائف التي قد تكون مفيدة لك في المستقبل:

$file = ftp_mkdir($conn_ftp, "public_html/materials/345"); // إنشاء الدليل 345 في مجلد المواد، إذا كان مجلد المواد غير موجود، // فسيتم إنشاؤه أيضًا، نفس الشيء مع المجلد public_html (يُشار إلى هذا الدليل // حتى تتمكن من رؤية المسار بالكامل، وإلا فهو مجرد مجلد به موقع) ftp_chdir($conn_ftp, "public_html/materials"); // إذا كان لديك بالتأكيد مجلد مواد، فلن تضطر إلى كتابة المسار // بالكامل، يمكنك فقط الانتقال إليه أولاً ثم إنشاء مجلد 345 فيه باستخدام // الكود التالي ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $file); // يتم إنشاء جميع المجلدات باستخدام الوضع 0755 افتراضيًا، وسيسمح لك هذا الأمر بتغيير // إلى 0777، مما سيسمح لك بإضافة ملفات إلى المجلد الذي تم إنشاؤه.

سأقدم الآن مثالاً كاملاً عن كود العمل حتى تتمكن من رؤية كيف يبدو كل شيء، على سبيل المثال، رمزي:

$dir_name = time(); // هنا أقوم بإنشاء اسم المجلد بناءً على وقت تشغيل البرنامج النصي $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); إذا($conn_ftp) // كان الاتصال ناجحًا ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // أدخل معلومات تسجيل الدخول وكلمة المرور الخاصة بك لـ FTP if($login_result) // تم التحقق من تسجيل الدخول وكلمة المرور النجاح ( ftp_pasv ($conn_ftp, TRUE); ftp_chdir ($conn_ftp, "public_html/materials"); ftp_mkdir ($conn_ftp, $dir_name); ftp_chmod($conn_ftp, 0777, $dir_name); ) )

من المفيد أيضًا أن نقول القليل عن تحديد الدلائل عند الإنشاء؛ إذا قمت بتحديد شرطة مائلة في البداية، فسيتم إنشاء المجلد نسبة إلى جذر بروتوكول نقل الملفات. عند الاتصال بخادم FTP، فأنت دائمًا تتصل بالجذر، لذا ضع ذلك في الاعتبار.