العمل مع الملفات في PHP. قراءة الملف، والكتابة إلى الملف

$Vdata = file_get_contents("textfile.txt");

ولكن الآن أنا بحاجة لتحميل ملف PHP.

أعتقد أنك تريد الحصول عليه PHP المحتوى الذي تم إنشاؤه، اذا كان صحيحا:

$Vdata = file_get_contents("http://YOUR_HOST/YOUR/FILE.php");

خلاف ذلك، إذا كنت ترغب في الحصول عليها كود مصدر ملف PHP، وهذا هو نفس ملف .txt:

$Vdata = file_get_contents("path/to/YOUR/FILE.php");

Ob_start(); تضمين "yourfile.php"؛ $myvar = ob_get_clean();

إذا كنت تستخدم http://كما اقترح Eyel، ستتمكن فقط من قراءة مخرجات PHP النصي. لا يمكنك قراءة برنامج PHP النصي إلا إذا كان موجودًا على نفس الخادم الذي يوجد به البرنامج النصي الخاص بك. ثم يمكنك استخدام شيء مثل

$Vdata = file_get_contents("/path/to/your/file.php");

إذا كنت تريد تنزيل ملف دون تشغيله عبر خادم ويب، فيجب أن يعمل ما يلي.

$string = eval(file_get_contents("file.php"));

سيتم بعد ذلك تنزيل محتويات الملف. يجب أن يتكون ملف PHP بالكامل باستخدام العلاماتللحصول على تقييم لذلك.

من الناحية النظرية، يمكنك فقط استخدام fopen ثم استخدامstream_get_contents.

$stream = fopen("file.php"،"r"); $string =stream_get_contents($stream); fClose($stream);

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

لن يعمل file_get_contents() إذا كان الخادم الخاص بك تم تعطيلallow_url_fopen. يتم تعطيل معظم مضيفي الويب المشتركين بشكل افتراضي بسبب المخاطر الأمنية. الى جانب ذلك، في PHP6خيار allow_url_fopenلن تعد موجودة وستعمل جميع الوظائف كما لو كانت معطلة بشكل دائم. لذلك هذه طريقة سيئة للغاية للاستخدام.

أفضل حالة استخدام لك إذا كنت تصل إلى ملف عبر http هي cURL

قبل محاولة العمل مع ملف ما، من المستحسن التأكد من وجوده. لحل هذه المشكلة، عادة ما يتم استخدام وظيفتين:

file_exists() و is_file().

تتحقق الدالة file_exists()‎ من وجود ملف معين. إذا كان الملف موجودًا، فسترجع الدالة TRUE، وإلا فإنها ترجع FALSE. بناء جملة الدالة file_exists() هو:

ملف منطقي_موجود (ملف سلسلة)

مثال للتحقق من وجود ملف:

إذا (! file_exists($filename)) :

طباعة "الملف $filename غير موجود!";

is_file()

تتحقق الدالة is_file() من وجود ملف معين وما إذا كان يمكن قراءته/كتابته. بشكل أساسي، is_file() هو إصدار أكثر قوة من file_exists() الذي يتحقق ليس فقط من وجود الملف، ولكن أيضًا ما إذا كان يمكنه قراءة البيانات وكتابتها:

منطقي هو ملف (ملف سلسلة)

يوضح المثال التالي كيفية التحقق من وجود ملف وإمكانية إجراء العمليات عليه:

$file = "somefile.txt";

إذا (is_file($file)) :

طباعة "الملف $file صالح وموجود!";

طباعة "الملف $file غير موجود أو أنه ليس ملفًا صالحًا!";

بعد التأكد من وجود الملف المطلوب وأنه يمكن تنفيذ عمليات القراءة/الكتابة المختلفة به، يمكنك المتابعة إلى الخطوة التالية - فتح الملف.

تقوم الدالة png () بإرجاع الحجم (بالبايت) للملف بالاسم المحدد، أو FALSE في حالة الخطأ. بناء جملة الدالة Filesize():

حجم الملف (اسم ملف السلسلة)

لنفترض أنك تريد تحديد حجم ملف Pastry.txt. للحصول على المعلومات الضرورية، يمكنك استخدام الدالة png:

$fs = png("pastry.txt"); اطبع "Pastry.txt هو $fs بايت.";

يتم عرض النتيجة التالية:

Pastry.txt هو 179 بايت.

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

فتح وإغلاق الملفات

قبل أن تتمكن من إجراء الإدخال/الإخراج على ملف، يجب عليك فتحه باستخدام fopen().

تفتح الدالة fopen() ملفًا (إذا كان موجودًا) وترجع عددًا صحيحًا يسمى مناور الملف(مقبض الملف). بناء جملة الدالة fopen():

int fopen (ملف سلسلة، وضع السلسلة [، intenable_path])

يمكن أن يكون الملف الذي يتم فتحه موجودًا على نظام الملفات المحلي، أو موجودًا كدفق إدخال/إخراج قياسي، أو يمثل ملفًا على نظام بعيد مقبول عبر HTTP أو FTP.

يمكن تحديد معلمة الملف في عدة نماذج، مدرجة أدناه:

إذا كان المعامل يحتوي على اسم ملف محلي، فإن fopen()‎ يفتح هذا الملف ويعيد المقبض.

إذا تم تحديد المعلمة كـ php://stdin، أو php://stdout، أو php://stderr، فسيتم فتح دفق الإدخال/الإخراج القياسي المقابل.

إذا كانت المعلمة تبدأ بالبادئة http://، فستفتح الوظيفة اتصال HTTP بالخادم وترجع مؤشرًا للملف المحدد.

إذا كانت المعلمة تبدأ بالبادئة ftp://، فستفتح الوظيفة اتصال FTP بالخادم وترجع مؤشرًا للملف المحدد. هناك شيئان يجب الانتباه لهما بشكل خاص في هذه الحالة: إذا كان الخادم لا يدعم وضع FTP السلبي، فسيفشل استدعاء fopen(). علاوة على ذلك، يتم فتح ملفات FTP إما للقراءة أو الكتابة.

عند التشغيل في الوضع السلبي، ينتظر خادم YAR الاتصالات من العملاء. عند التشغيل في الوضع النشط، يقوم الخادم نفسه بإنشاء اتصال مع العميل. الافتراضي هو عادة الوضع النشط.

تحدد معلمة الوضع القدرة على القراءة والكتابة في الملف. في الجدول 7.1 يسرد بعض القيم التي تحدد وضع فتح الملف.

الجدول 7.1. أوضاع فتح الملفات

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

إذا كان المعامل الثالث الاختياري include_path هو 1، فإن مسار الملف يكون متعلقًا بدليل التضمين المحدد في ملف php.ini (راجع الفصل الأول).

يوجد أدناه مثال لفتح ملف باستخدام الدالة fopen(). يقدم استدعاء die()‎، المستخدم مع fopen()‎، رسالة خطأ إذا تعذر فتح الملف:

$file = "userdata.txt"; // بعض الملفات

$fh = fopen($file, "a+") أو die("الملف ($file) غير موجود!");

يفتح المقتطف التالي اتصالاً بموقع PHP (http://www.php.net):

$site = "http://www.php.net": // يمكن الوصول إلى الخادم عبر HTTP

$sh = fopen($site., "r"); // قم بربط المعالج بصفحة فهرس Php.net

بعد الانتهاء من العمل، يجب دائمًا إغلاق الملف باستخدام fclose().

تقوم الدالة fClose() بإغلاق ملف باستخدام المعالج المحدد. إذا نجح الإغلاق، فسيتم إرجاع TRUE، وإذا لم ينجح الإغلاق، فسيتم إرجاع FALSE. بناء جملة الدالة fClose():

كثافة العمليات FClose (معالج كثافة العمليات)

تقوم الدالة f Close () بإغلاق الملفات التي تم فتحها مسبقًا بواسطة الدالة fopen () أو fsockopen () بنجاح. مثال لإغلاق ملف:

$file = "userdata.txt";

إذا (file_exists($file)) :

$fh = fopen($file, "r");

// تنفيذ عمليات الملف

طباعة "ملف Sfile غير موجود!";

الكتابة إلى الملف

هناك عمليتان رئيسيتان يتم إجراؤهما على الملفات المفتوحة: القراءة والكتابة.

تتحقق الدالة is_writeable()‎ من وجود الملف وقابليته للكتابة. يتم التحقق من إمكانية الكتابة لكل من الملف والدليل. بناء جملة الدالة is_writeable() هو:

المنطق قابل للكتابة (ملف سلسلة)

أحد الأشياء المهمة التي يجب ملاحظتها هو أن PHP ستعمل على الأرجح تحت معرف المستخدم الذي يستخدمه خادم الويب (عادةً "لا أحد"). يوجد مثال لاستخدام is_writeable() في وصف الدالة fwrite().

تقوم الدالة fwrite() بكتابة محتويات متغير السلسلة إلى الملف المحدد بواسطة معالج الملف. fwrite() بناء جملة الدالة:

int fwrite (معالج int، متغير السلسلة [، طول int])

إذا تم تمرير معلمة الطول الاختيارية عند استدعاء الوظيفة، فستتوقف الكتابة إما بعد كتابة عدد الأحرف المحدد أو عند الوصول إلى نهاية السطر. يتم توضيح التحقق من إمكانية الكتابة إلى ملف في المثال التالي:

// معلومات حول حركة المرور على موقع المستخدم

$data = "08:13:00|12:37:12|208.247.106.187|Win98";

$filename = "somefile.txt";

// إذا كان الملف موجودًا ويمكن الكتابة إليه

إذا (is_writeable($filename)) :

$fh = fopen($filename, "a+");

// اكتب محتويات بيانات $ إلى ملف

نجاح $ - fwrite($fh, $data);

// إغلاق الملف

فكلوز($fh); آخر:

طباعة "تعذر فتح اسم الملف للكتابة";

الدالة fputs() هي اسم مستعار لـ fwrite() ويمكن استخدامها في أي مكان يتم فيه استخدام fwrite().

الدالة fputs() هي اسم مستعار للدالة fwrite() ولها نفس الصيغة تمامًا. بناء جملة الدالة fputs():

int fputs (معالج int، متغير السلسلة [، طول int])

أنا شخصياً أفضل استخدام fputs(). يجب أن نتذكر أن هذه مجرد مسألة أسلوب ولا علاقة لها بأي اختلافات بين الوظيفتين.

القراءة من ملف

مما لا شك فيه أن القراءة هي أهم عملية يتم إجراؤها على الملفات. وفيما يلي بعض الميزات التي تجعل القراءة من ملف أكثر كفاءة. يقوم بناء جملة هذه الوظائف تقريبًا بنسخ بناء جملة وظائف التسجيل المشابهة.

تتيح لك الدالة i s_readable()‎ التحقق من وجود الملف وقابليته للقراءة. يتم التحقق من إمكانية القراءة لكل من الملف والدليل. صيغة الدالة is_readable() هي:

بوو! is_readable (ملف سلسلة)

على الأرجح، سيتم تشغيل PHP تحت معرف المستخدم الذي يستخدمه خادم الويب (عادةً "لا أحد")، لذلك لكي تقوم الدالة is_readable() بإرجاع TRUE، يجب السماح للجميع بقراءة الملف. يوضح المثال التالي كيفية التحقق من وجود الملف وقابليته للقراءة:

إذا (is_readable($filename)) :

// افتح الملف واضبط مؤشر الموضع الحالي على نهاية الملف

$fh = fopen($filename, "r");

طباعة "اسم الملف $ غير قابل للقراءة!";

تقرأ الدالة fread() العدد المحدد من البايتات من ملف محدد بواسطة معالج الملف. fwrite() بناء جملة الدالة:

كثافة العمليات فريد (كثافة العمليات، طول كثافة العمليات)

يجب أن يشير المعالج إلى ملف مفتوح قابل للقراءة (راجع وصف الدالة is_readable()). تتوقف القراءة بعد قراءة عدد محدد من البايتات أو عند الوصول إلى نهاية الملف. خذ بعين الاعتبار الملف النصي Pastry.txt الموضح في القائمة 7.1. تتم قراءة هذا الملف وإخراجه في المتصفح من خلال الجزء التالي:

$fh = fopen("pastry.txt", "r") أو die("لا يمكن فتح الملف!");

$file = fread($fh, png($fh));

باستخدام الدالة fllesize() لتحديد حجم ملف Pastry.txt بالبايت، فإنك تتأكد من أن الدالة fread() تقرأ محتويات الملف بالكامل.

القائمة 7.1. ملف نصي Pastry.txt

الوصفة: عجينة المعجنات

1 1/4 كوب دقيق لجميع الأغراض

3/4 أصبع (6 ملاعق كبيرة) من الزبدة غير المملحة، مقطعة

2 ملعقة كبيرة سمن نباتي 1/4 ملعقة صغيرة ملح

3 ملاعق كبيرة ماء

تقوم الدالة fgetc() بإرجاع سلسلة تحتوي على حرف واحد من الملف عند موضع المؤشر الحالي، أو FALSE عند الوصول إلى نهاية الملف. بناء جملة الدالة fgetc():

سلسلة fgetc (معالج int)

يجب أن يشير المعالج إلى ملف مفتوح قابل للقراءة (راجع وصف الدالة is_readable()‎ سابقًا في هذا الفصل). يوضح المثال التالي قراءة وإخراج ملف حرفًا تلو الآخر باستخدام الدالة fgetc():

$fh = fopen("pastry.txt", "r"); بينما (!feof($fh)) :

$شار = fgetc($fh):

طباعة شار $؛ في نهاية المطاف؛

تقوم الدالة fgets() بإرجاع سلسلة مقروءة من موضع المؤشر الحالي في الملف المحدد بواسطة معالج الملف. يجب أن يشير مؤشر الملف إلى ملف مفتوح قابل للقراءة (راجع وصف الدالة is_readable()‎ سابقًا في هذا الفصل). fgets () بناء جملة الدالة:

سلسلة fgets (معالج int، طول int)

تتوقف القراءة عند استيفاء أحد الشروط التالية:

  • القراءة من طول الملف - 1 بايت؛
  • تمت قراءة حرف السطر الجديد من الملف (المضمن في السلسلة التي تم إرجاعها)؛
  • تمت قراءة علامة نهاية الملف (EOF) من الملف.

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

$fh = fopen("pastry.txt", "r");

بينما (!feof($fh));

$line = fgets($fh, 4096);

طباعة سطر $ "
";

الدالة fgetss() تشبه تمامًا fgets() مع استثناء واحد - فهي تحاول إزالة كافة علامات HTML وPHP من النص المقروء:

سلسلة fgetss (معالج Int، طول int [، علامات_السلسلة المسموح بها])

قبل الانتقال إلى الأمثلة، راجع محتويات القائمة 7.2 - يُستخدم هذا الملف في القائمتين 7.3 و7.4.

القائمة 7.2. ملف science.html

الأخبار العاجلة - العلوم

اكتشاف شكل حياة فضائي


20 أغسطس 2000

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

القائمة 7.3. إزالة العلامات من ملف HTML قبل عرضها في المتصفح

$fh = fopen("science.html", "r");

بينما (!feof($fh)) :

طباعة fgetss($fh, 2048);

وتظهر النتيجة أدناه. كما ترون، تمت إزالة كافة علامات HTML من ملف science.html، مما تسبب في فقدان التنسيق:

في بعض الحالات، تتم إزالة كافة العلامات من الملف باستثناء عدد قليل منها - على سبيل المثال، علامات فاصل الأسطر
. توضح القائمة 7.4 كيف يتم ذلك.

القائمة 7.4. إزالة العلامات بشكل انتقائي من ملف HTML

$fh = fopenC"science.html", "r");

$ المسموح به = "
";

بينما (!feof($fh)) :

طباعة fgetss($fh.2048, $allowable);

نتيجة:

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

كما ترون، فإن الدالة fgetss() تجعل تحويل الملفات أمرًا سهلاً، خاصة عندما يكون لديك عدد كبير من ملفات HTML ذات التنسيق المماثل.

قراءة ملف في مصفوفة

تقوم الدالة file() بتحميل محتويات الملف بالكامل إلى مصفوفة قابلة للفهرسة. يتوافق كل عنصر من عناصر المصفوفة مع سطر واحد من الملف. بناء جملة الدالة File():

ملف المصفوفة (ملف سلسلة [، int include_path])

إذا كان المعامل الثالث الاختياري include_path هو 1، فإن مسار الملف يكون متعلقًا بدليل التضمين المحدد في ملف php.ini (راجع الفصل الأول). تستخدم القائمة 7.5 الدالة file() لتحميل ملف Pastry.txt (انظر القائمة 7.1).

$file_array = file("pastry.txt");

بينما (list($line_num.$line) = everyt($file_array)):

مطبعة " السطر $line_num:"، htmlspecialchars($line)، "
\ن"

تتم طباعة كل صف من المصفوفة مع رقم:

السطر 0: الوصفة: عجينة المعجنات

السطر 1: 1 1/4 كوب دقيق متعدد الأغراض

السطر الثاني: 3/4 إصبع (6 ملاعق كبيرة) من الزبدة غير المملحة، مقطعة

السطر الثالث: 2 ملعقة كبيرة سمن نباتي

السطر الرابع: ربع ملعقة صغيرة ملح

السطر الخامس: 3 ملاعق كبيرة ماء

إعادة توجيه ملف إلى الإخراج القياسي

تقرأ الدالة readfile() محتويات الملف وتكتبه إلى الإخراج القياسي (في معظم الحالات، إلى المتصفح). readfile () بناء جملة الدالة:

ملف قراءة int (ملف سلسلة [، int include_path])

ترجع الدالة عدد البايتات المقروءة. يمكن أن يوجد الملف على نظام الملفات المحلي، أو يوجد كمدخل/مخرج قياسي، أو يمثل الملف على نظام بعيد مقبول عبر HTTP أو FTP. يتم تعيين معلمة الملف وفقًا لنفس القواعد الموجودة في وظيفة fopen().

لنفترض أن لديك ملف latorre.txt، الذي تريد عرض محتوياته في المتصفح:

مطعم "لا توري". يقع في نيتونو، إيطاليا، ويقدم مزيجًا انتقائيًا من الأناقة. التاريخ والمأكولات البحرية الفاخرة. داخل أسوار بورجو التي تعود للقرون الوسطى المحيطة بالمدينة، يمكن للمرء تناول العشاء أثناء مشاهدة المارة وهم يتسوقون في متاجر القرية. الراحة المقترنة بالمأكولات البحرية الطازجة تجعل من مطعم La Torre واحدًا من أرقى المطاعم في إيطاليا.

عند تنفيذ المقتطف التالي، يتم إرسال محتويات ملف latorre.txt بالكامل إلى الإخراج القياسي:

$restaurant_file = "latorre.txt";

// أرسل الملف بأكمله إلى الإخراج القياسي

readfile($restaurant_file);

فتح معالج ملف العملية

إلى جانب الملفات العادية، يمكنك فتح معالجات الملفات للتفاعل مع العمليات الموجودة على الخادم. تم حل المشكلة عن طريق الدالة popen()، والتي تحتوي على الصيغة التالية:

int popen (أمر السلسلة، وضع السلسلة)

تحدد معلمة الأمر أمر النظام الذي سيتم تنفيذه، وتصف معلمة الوضع وضع الوصول:

// افتح ملف "spices.txt" للكتابة

$fh = fopen("spices.txt"،"w");

// أضف بعض الأسطر من النص

fputs($fh, "بقدونس، حكيم، إكليل الجبل\n");

fputs($fh, "بابريكا، ملح، فلفل\n");

fputs($fh, "ريحان, حكيم, زنجبيل\n");

// أغلق المناور

// افتح عملية grep الخاصة بـ UNIX للبحث عن كلمة Basil في ملف Spice.txt

$fh - popen("grep Basil< spices.txt", "r");

// اطبع نتيجة grep

تبدو النتيجة كما يلي:

ريحان، حكيم، زنجبيل

الدالة fpassthru()‎ تشبه الدالة passthru()‎ التي تمت مناقشتها في قسم "تشغيل البرامج الخارجية" في هذا الفصل.

بعد الانتهاء من جميع العمليات، يجب إغلاق الملف أو العملية. تقوم الدالة pClose() بإغلاق الاتصال بالعملية المحددة بواسطة المعالج، على غرار الطريقة التي تغلق بها الدالة fclose() ملفًا مفتوحًا بواسطة الدالة fopen(). بناء جملة الدالة pClose():

int p Close (معالج int)

في المعلمة مناوريتم إرسال المناور الذي تم تلقيه مسبقًا بمكالمة ناجحة لـ popen().

فتح اتصال مأخذ التوصيل

لا يقتصر PHP على التفاعل مع الملفات والعمليات، بل يمكنك أيضًا إجراء اتصالات عبر المقابس. قابس كهرباءالمقبس عبارة عن تجريد برمجي يسمح لك بالتواصل مع الخدمات المختلفة الموجودة على جهاز كمبيوتر آخر.

تقوم الدالة fsockopen() بإنشاء اتصال مأخذ توصيل بخادم على الإنترنت

عبر بروتوكول TCP أو UDP. بناء جملة الدالة fsockopen():

int fsockopen (عقدة السلسلة، منفذ int [، int error_code [، string error_text [، int timeout]]])

تحتوي المعلمات الاختيارية error_code وerror_text على معلومات سيتم عرضها في حالة فشل الاتصال بالخادم. يجب أن يتم تمرير كلا المعلمتين حسب المرجع. تحدد المعلمة الاختيارية الثالثة، المهلة، طول الفترة الزمنية لانتظار الاستجابة من الخادم (بالثواني). توضح القائمة 7.6 استخدام الدالة fsockopen()‎ للحصول على معلومات الخادم. ومع ذلك، قبل النظر إلى القائمة 7.6، هناك وظيفة أخرى تحتاج إلى التعرف عليها: المقبس_set_blocking().

UDP (بروتوكول مخطط بيانات المستخدم) هو بروتوكول اتصال بدون اتصال.

المقبس_set_blocking()

تتيح لك وظيفة المقبس_set_b1ocki ng() ضبط التحكم في المهلة لعمليات الخادم:

المقبس_set_blocking (معالج int، الوضع المنطقي)

تحدد معلمة المعالج المقبس المفتوح مسبقًا، وتحدد معلمة الوضع الوضع الذي تم تحويل المقبس إليه (TRUE لوضع الحظر، FALSE لوضع عدم الحظر). يظهر مثال لاستخدام الدالتين fsockopen() وsocket_set_blocking() في القائمة 7.6.

القائمة 7.6. استخدام fsockopen() للحصول على معلومات الخادم

وظيفة getthehost($host.$path) (

// فتح الاتصال بالعقدة

$fp - fsockopen($host, 80, &$errno, &$errstr, 30);

// انتقل إلى وضع الحظر

المقبس_set_blocking($fp, 1),

// إرسال الرؤوس

fputs($fp,"GET $path HTTP/1.1\r\n");

fputs($fp, "Host: $host\r\n\r\n"); $س = 1;

// احصل على الرؤوس

بينما($x< 10) :

$headers = fgets($fp, 4096);

// أغلق المناور

getthehost("www.apress.com", "/");

يؤدي تشغيل القائمة 7.6 إلى إنتاج المخرجات التالية:

HTTP/1.1 200 OK الخادم: موقع محتوى Microsoft-IIS/4.0:

2000 20:25:06 بتوقيت جرينتش ETag: "f0a61666dbff1bf1:34a5" طول المحتوى: 1311

الدالة pfsockopen() هي نسخة ثابتة من fsockopen(). وهذا يعني أنه لن يتم إغلاق الاتصال تلقائيًا عند انتهاء البرنامج النصي الذي تم استدعاء الوظيفة فيه. بناء جملة الدالة pfsockopen() هو:

int pfsockopen (عقدة السلسلة، منفذ int [، int error_code [، string error_text [، int timeout]]])

اعتمادًا على الأهداف المحددة لتطبيقك، قد تجد أنه من الملائم أكثر استخدام pfsockopen() بدلاً من fsockopen().

إطلاق البرامج الخارجية

يمكن لبرامج PHP النصية أيضًا تنفيذ البرامج الموجودة على الخادم. تُستخدم هذه الميزة غالبًا بشكل خاص عند إدارة النظام عبر متصفح الويب، وكذلك للحصول على معلومات موجزة حول النظام بسهولة أكبر.

تقوم الدالة exec() بتشغيل برنامج معين وإرجاع السطر الأخير من مخرجاته. بناء جملة الدالة exec():

سلسلة exec (أمر السلسلة [، صفيف السلسلة [، int return]])

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

توضح القائمة 7.7 كيفية استخدام الدالة exec() لتنفيذ وظيفة نظام UNIX ping.

القائمة 7.7. التحقق من الاتصال بالخادم باستخدام الدالة exec()

exec("ping -from 5 www.php.net", $ping);

// في نظام التشغيل Windows - exec("ping -n 5 www.php.net.$ping);

لـ ($i=0; $i< count($ping);$i++) :

مطبعة "
$ping[$i]";

نتيجة:

PING www.php.net (208.247.106.187): 56 بايت بيانات

64 بايت من 208.247.106.187: icmp_seq=0 ttl=243 time=66.602 مللي ثانية

64 بايت من 208.247.106.187: icmp_seq=1 ttl=243 time=55.723 مللي ثانية

64 بايت من 208.247.106.187: icmp_seq=2 ttl=243 time=70.779 مللي ثانية

64 بايت من 208.247.106.187: icmp_seq=3 ttl=243 مرة=55.339 مللي ثانية

64 بايت من 208.247.106.187: icmp_seq=4 ttl=243 مرة=69.865 مللي ثانية

www.php.net إحصائيات بينغ -

تم إرسال 5 حزم. تم استلام 5 حزم. فقدان الحزمة 0%

دقيقة ذهابًا وإيابًا/المتوسط/الحد الأقصى/القياس القياسي - 55.339/63.662/70.779/6.783 مللي ثانية

عودة الفواصل العليا

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

مطبعة "

$ الإخراج
";

يعرض هذا المقتطف محتويات الدليل الذي يوجد به البرنامج النصي في المتصفح.

تحدد المعلمة الداخلية ping -c 5 (-p 5 في نظام التشغيل Windows) عدد استقصاءات الخادم.

إذا كنت تريد فقط إرجاع النتائج غير المنسقة لأمر ما، فاستخدم الدالة passthru() الموضحة أدناه.

تعمل الدالة passthru() تقريبًا بنفس طريقة عمل exec()، مع استثناء واحد - فهي تطبع نتائج الأمر تلقائيًا. بناء جملة الدالة Passthru():

تمرير باطل (أمر السلسلة [، int return])

إذا تم تمرير معلمة إرجاع اختيارية عند استدعاء passthru()، فسيتم تعيين هذا المتغير على رمز الإرجاع للأمر الذي تم تنفيذه.

الهروبشيلكمد ()

تتجنب الدالة escapeshellcmd() أي أحرف يحتمل أن تكون خطيرة والتي قد يدخلها المستخدم (على سبيل المثال، في نموذج HTML) لتنفيذ أوامر exec()، أو passthru()، أو system()، أو popen(). بناء الجملة:

سلسلة escapeshellcmd (أمر سلسلة)

يجب دائمًا التعامل مع إدخالات المستخدم ببعض الحذر، ولكن على الرغم من ذلك، يمكن للمستخدمين إدخال الأوامر التي سيتم تنفيذها بواسطة وظائف أوامر النظام. خذ بعين الاعتبار المقتطف التالي:

$user_input = `rm -rf *`; // احذف الدليل الأصلي وجميع أدلةه الفرعية

exec($user_input); // تنفيذ $user_input !!!

إذا لم يتم اتخاذ أي احتياطات، فإن مثل هذا الأمر سيؤدي إلى كارثة. ومع ذلك، يمكنك استخدام وظائف escapeshellcmd() للهروب من إدخال المستخدم:

$user_input = `rm - rf *`; // احذف الدليل الأصلي وجميع أدلةه الفرعية

ex(escapeshellcmd($user_input)); // الهروب من الشخصيات الخطرة

تفلت الدالة escapeshellcmd() من الحرف *، مما يمنع الأمر من حدوث عواقب كارثية.

يعد الأمان أحد أهم جوانب برمجة الويب، لذلك خصصت فصلاً كاملاً لهذا الموضوع ومدى ارتباطه ببرمجة PHP. انظر الفصل 16 لمزيد من المعلومات.

العمل مع نظام الملفات

لدى PHP وظائف لعرض وتنفيذ عمليات مختلفة على الملفات الموجودة على الخادم. غالبًا ما تكون المعلومات حول سمات ملف الخادم (الموقع والمالك والامتيازات) مفيدة.

تقوم الدالة basename() باستخراج اسم الملف من الاسم الكامل الذي تم تمريره. بناء جملة الدالة Basename():

الاسم الأساسي للسلسلة (الاسم الكامل للسلسلة)

يتم استخراج اسم الملف الأساسي من الاسم الكامل كما يلي:

$path = "/usr/local/phppower/htdocs/index.php"; $file = الاسم الأساسي($path); // ملف $ = "index.php"

في الواقع، تقوم هذه الوظيفة بإزالة المسار من الاسم الكامل وتترك اسم الملف فقط.

تقوم الدالة getlastmod() بإرجاع تاريخ ووقت آخر تعديل للصفحة التي تم استدعاء الدالة منها. بناء جملة الدالة getlastmod():

إنت getlastmod (باطل)

تتبع القيمة المرجعة تنسيق التاريخ/الوقت في UNIX، ويمكنك استخدام الدالة date() لتنسيقها. يعرض المقتطف التالي تاريخ آخر تعديل للصفحة:

echo "آخر تعديل: ".date("H:i:s a".getlastmod());

تقوم الدالة stat() بإرجاع مصفوفة قابلة للفهرسة تحتوي على معلومات تفصيلية حول الملف بالاسم المحدد:

إحصائيات الصفيف (اسم ملف السلسلة)

يتم إرجاع المعلومات التالية في عناصر المصفوفة:

0 جهاز

2 وضع حماية عقدة الفهرس

3 عدد الروابط

4 معرف المستخدم المالك

5 معرف مجموعة المالك

6 نوع جهاز عقدة الفهرس

7 الحجم بالبايت

8 وقت آخر مكالمة

9 وقت التعديل الأخير

10 آخر مرة تم تعديلها

11 حجم الكتلة لنظام الملفات I/O

12 عدد الكتل المخصصة

وبالتالي، إذا كنت تريد معرفة آخر مرة تم فيها الوصول إلى الملف، فانظر إلى العنصر 8 من المصفوفة التي تم إرجاعها. لنلقي نظرة على مثال:

ملف $ - "datafile.txt"؛

قائمة($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $size, $atime, $mtime, $ctime,

$bsize) = stat($file);

اطبع "ملف $ هو بايت بحجم $.
";

اطبع "آخر وقت وصول: $atime
";

اطبع "وقت التعديل الأخير: $mtime
";

نتيجة:

popen.php هو 289 بايت.

آخر وقت للوصول: 15 أغسطس 2000 الساعة 12:00:00

وقت التعديل الأخير: 15 أغسطس 2000 10:07:18

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

عرض وتغيير خصائص الملف

يتمتع كل ملف في أنظمة عائلة UNIX بثلاث خصائص مهمة:

  • الانتماء إلى مجموعة؛
  • مالك؛
  • الأذونات.

يمكن تغيير كل هذه الخصائص باستخدام وظائف PHP المناسبة. الميزات الموضحة في هذا القسم لا تعمل على أنظمة عائلة Windows.

إذا لم تكن لديك خبرة في أنظمة التشغيل UNIX، فيمكن العثور على معلومات حول خصائص نظام الملفات UNIX على http://sunsite.auc.dk/linux-newbie/FAQ2.htm. تمت مناقشة موضوعات عضوية المجموعة والملكية والأذونات في القسم 3.2.6.

تحاول الدالة chgrp() تغيير المجموعة التي ينتمي إليها الملف المحدد. chgrp () بناء جملة الدالة:

int chgrp (اسم ملف السلسلة، المجموعة المختلطة)

تقوم الدالة filegroup() بإرجاع معرف المجموعة لمالك الملف بالاسم المحدد، أو FALSE في حالة الخطأ. بناء جملة الدالة Filegroup():

مجموعة الملفات int (اسم ملف السلسلة)

تقوم الدالة chmod() بتغيير أذونات الملف بالاسم المحدد. بناء جملة الدالة chmod():

int chmod (اسم ملف السلسلة، أذونات int)

يتم تحديد الأذونات في التدوين الثماني. يتم توضيح تفاصيل إعداد معلمة للدالة chmod() في المثال التالي:

chmod("data_file.txt", g+r); // لا يعمل

chmod("data_file.txt", 766); // لا يعمل

chmod("data_file.txt", 0766); // يعمل

تقوم الدالة fileperms() بإرجاع أذونات الملف بالاسم المحدد، أو FALSE في حالة الخطأ. بناء جملة الدالة Fileperms():

int fileperms (اسم ملف السلسلة)

تحاول الدالة chown() تغيير مالك الملف. يقتصر الحق في تغيير مالك الملف على المستخدم المميز. chown () بناء جملة الدالة:

int chown (اسم ملف السلسلة، المستخدم المختلط)

تقوم الدالة fileowner() بإرجاع معرف المستخدم لمالك الملف بالاسم المحدد. بناء جملة الدالة Fileowner():

مالك الملف int (اسم ملف السلسلة)

نسخ وإعادة تسمية الملفات

تتضمن وظائف النظام المفيدة الأخرى التي يمكن تنفيذها في نصوص PHP نسخ الملفات وإعادة تسميتها على الخادم. يتم تنفيذ هذه العمليات بواسطة وظيفتين: Copy() و rename().

لا يعد نسخ ملف في برنامج PHP النصي أكثر صعوبة من استخدام أمر UNIX cf. تم حل المشكلة عن طريق وظيفة PHP Copy(). بناء جملة الدالة soru() هو:

نسخة int (مصدر السلسلة، وجهة السلسلة)

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

$data_file = "data.txt";

Copy($data_file.$data_file".bak") أو die("تعذر نسخ $data_file");

تقوم الدالة rename() بإعادة تسمية الملف. في حالة النجاح، يتم إرجاع TRUE، وإذا لم ينجح، يتم إرجاع FALSE. إعادة تسمية () بناء جملة الدالة:

إعادة تسمية منطقية (سلسلة الاسم القديم، سلسلة اسم_الجديد)

مثال على إعادة تسمية ملف باستخدام الدالة rename():

$data_file = "data.txt";

rename($data file, $datafile".old") أو die("تعذر إعادة تسمية ملف البيانات $");

حذف الملفات

تقوم الدالة unlink() بحذف ملف بالاسم المحدد. بناء الجملة:

int إلغاء الارتباط (ملف سلسلة)

إذا كنت تعمل باستخدام PHP على نظام Windows، فقد تواجه أحيانًا مشكلات في استخدام هذه الميزة. في هذه الحالة، يمكنك استخدام وظيفة النظام () الموضحة أعلاه وحذف الملف باستخدام أمر DOS del:

نظام ("ديل filename.txt")؛

العمل مع الكتالوجات

تتيح لك وظائف PHP عرض محتويات الدلائل والتنقل فيها. تُظهر القائمة 7.8 بنية دليل نموذجية على نظام UNIX.

القائمة 7.8. هيكل الدليل النموذجي

تكمل وظيفة dirname() اسم القاعدة() - فهي تستخرج المسار من اسم الملف المؤهل بالكامل. بناء جملة الدالة dirname() هو:

اسم السلسلة (مسار السلسلة)

مثال على استخدام dirname() لاستخراج مسار من الاسم الكامل:

$path = "/usr/locla/phppower/htdocs/index.php";

$file = dirname($path); // $file = "usr/local/phppower/htdocs"

تُستخدم الدالة dirname() أحيانًا مع المتغير $SCRIPT_FILENAME للحصول على المسار الكامل للبرنامج النصي الذي يتم تنفيذ الأمر منه:

$dir - dirname($SCRIPT_FILENAME);

تتحقق الدالة is_dir() ما إذا كان الملف ذو الاسم المحدد هو دليل:

منطقي is_dir (اسم ملف السلسلة)

يستخدم المثال التالي بنية الدليل من القائمة 7.8:

$ isdir = is_dir("index.html"); // إرجاع خطأ

$isdir = is_dir("كتاب"); // إرجاع صحيح

تقوم الدالة mkdir() بنفس الشيء الذي يقوم به أمر UNIX الذي يحمل نفس الاسم، حيث تقوم بإنشاء دليل جديد. تركيب جملة الدالة mkdir():

int mkdir (مسار السلسلة، الوضع int)

تحدد معلمة المسار المسار لإنشاء الدليل الجديد. لا تنس إنهاء المعلمة باسم الدليل الجديد! تحدد معلمة الوضع الأذونات المعينة للدليل الذي تم إنشاؤه.

تمامًا كما تفتح الدالة fopen() مناورًا للعمل مع ملف معين، تفتح الدالة opendir() مناورًا للعمل مع الدليل. بناء جملة الدالة opendir() هو:

int opendir (مسار السلسلة)

تقوم الدالة Closedir() بإغلاق مؤشر الدليل الذي تم تمريره كمعلمة. بناء جملة الدالة Closedir() هو:

باطل مغلق (int Directory_manipulator)

تقوم الدالة readdir() بإرجاع العنصر التالي للدليل المحدد. بناء الجملة:

سلسلة readdir (int Directory_manipulator)

باستخدام هذه الوظيفة، يمكنك بسهولة إدراج جميع الملفات والأدلة الفرعية الموجودة في الدليل الحالي:

$dh = opendir(" .);

بينما ($file = readdir($dh)) :

طباعة "ملف $
"؛ في نهاية المطاف؛

تعمل الدالة chdir() تمامًا مثل أمر UNIX cd؛ فهي تتغير إلى الدليل المحدد بواسطة المعلمة. بناء جملة الدالة chdir():

int chdir (دليل السلسلة)

في المثال التالي ننتقل إلى الكتاب/ الدليل الفرعي ونطبع محتوياته:

$newdir = "كتاب";

chdir($newdir) أو die("تعذر التغيير إلى الدليل ($newdir)"); $dh = opendir(" . ");

بينما ($file = readdir($dh)) ؛

طباعة "ملف $
";

تقوم الدالة rewlnddir() بنقل مؤشر الموضع الحالي إلى بداية الدليل المفتوح بواسطة الدالة opendir(). بناء جملة الدالة rewinddir() هو:

الترجيع الفارغ (int Directory_manipulator)

المشروع 1: عداد ضربات بسيط

يقوم البرنامج النصي المعروض في هذا القسم بحساب عدد الزيارات إلى الصفحة الموجودة فيه. قبل الانتقال إلى الكود في القائمة 7.9، راجع الخوارزمية المكتوبة بالكود الزائف:

  1. قم بتعيين متغير الوصول $ اسم الملف الذي سيتم تخزين قيمة العداد فيه.
  2. استخدم الدالة file() لقراءة محتويات $access في مصفوفة $visits. تعمل البادئة @ قبل اسم الوظيفة على منع الأخطاء المحتملة (على سبيل المثال، لا يوجد ملف بالاسم المحدد).
  3. قم بتعيين المتغير $current_visitors على قيمة العنصر الأول (والوحيد) في المصفوفة $visits.
  4. قم بزيادة قيمة $current_visitors بمقدار 1.
  5. افتح ملف الوصول $ للكتابة واضبط مؤشر الموضع الحالي على بداية الملف.
  6. اكتب قيمة $current_visitors في ملف الوصول $.
  7. أغلق المعالج الذي يشير إلى ملف الوصول $.

القائمة 7.9. عداد ضرب بسيط

// البرنامج النصي: عداد ضربات بسيط

// الغرض: حفظ عدد الزيارات في الملف

$الوصول = "hits.txt"; // يتم اختيار اسم الملف بشكل تعسفي

$current_visitors = $visits; // استرداد العنصر الأول (والوحيد).

+$current_visitors; // زيادة عداد الضربات

$fh = fopen($access."w"); // افتح ملف hits.txt وقم بتثبيته

// مؤشر إلى الموضع الحالي في بداية الملف

@fwrite($fh, $current_visitors);// اكتب قيمة عداد جديدة

// إلى الملف "hits.txt"

فكلوز($fh); // أغلق معالج الملف "hits.txt"

المشروع الثاني: بناء خريطة الموقع

يبني البرنامج النصي في القائمة 7.10 خريطة موقع، وهي عرض هرمي لجميع المجلدات والملفات الموجودة على الخادم، بدءًا من دليل معين. يستخدم حساب المساحة المتروكة للعناصر التي تشكل خريطة الموقع الوظائف المحددة في هذا الفصل والفصول السابقة. قبل الانتقال إلى البرنامج، راجع الخوارزمية المكتوبة بالكود الزائف:

  1. قم بتعريف متغيرات الخدمة لتخزين الدليل الأصلي واسم الملف الرسومي مع صورة المجلد واسم الصفحة وعلامة نظام تشغيل الخادم (Windows أو نظام آخر).
  2. قم بتعريف وظيفة Display_directory () التي تقرأ محتويات الدليل وتنسيقه للعرض في المتصفح.
  3. أنشئ مسار الدليل من خلال دمج الاسم الذي تم تمريره في المتغير $dir1 مع $dir.
  4. افتح الدليل واقرأ محتوياته. تنسيق أسماء الدليل والملفات وعرضها في المتصفح.
  5. إذا كان الملف الحالي عبارة عن دليل، فاستدعاء Display_di Rectory() بشكل متكرر وقم بتمرير اسم الدليل الجديد لعرضه. حساب المسافة البادئة المستخدمة عند تنسيق الإخراج.

إذا لم يكن الملف دليلاً، فسيتم تنسيقه لعرضه كارتباط تشعبي (ويُحسب أيضًا المسافة البادئة المستخدمة في التنسيق).

القائمة 7.10. برنامج Sitemap.php

// الملف: sitemap.php

// الغرض: بناء خريطة الموقع

// الدليل الذي يبدأ منه بناء الخريطة

$beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";

// ملف به صورة رسومية للمجلد.

// يجب أن يكون المسار نسبيًا* للدليل الجذر لخادم Apache

$folder_location = "C:\My Documents\PHP for Programmers\FINAL CHPS\graphics\folder.gif";

// النص الموجود في النافذة title $page_name = "PHPRecipes SiteMap";

// على أي نظام سيتم استخدام البرنامج النصي - Linux أم Windows؟

// (0 - ويندوز؛ 1 - لينكس)

$usingjinux = 0;

// الوظيفة: Display_directory

// الغرض: قراءة محتويات الدليل المحدد بواسطة المعلمة

// $dir1، متبوعًا بتنسيق الدليل والتسلسل الهرمي للملفات.

// يمكن استدعاء الوظيفة بشكل متكرر.

وظيفة عرض_الدليل ($dir1، $folder_location، $using_linux، $init_عمق) (

// تحديث المسار

Sdh = opendir($dir);

بينما($file = readdir($dh)) :

// عناصر الدليل "." و".." ليسا مخرجين.

إذا (($file != "."") && ($file != "..")) :

إذا ($using_linux == 0):

$العمق = تنفجر("\\"، $dir): آخر:

$عمق = تنفجر("/", $dir); إنهاء إذا ؛ $curtent_عمق = حجم($عمق);

// أنشئ المسار وفقًا لقواعد نظام التشغيل المستخدم. إذا ($using_linux == 0):

$tab_عمق = $current_deptn - $init_عمق؛

ملف $ = $dir. "\\"، ملف $؛ آخر:

ملف $ = $dir. "/"، ملف $؛ إنهاء إذا؛

// هل يحتوي الملف $ على دليل؟ إذا (هو دير(ملف $)) :

// حساب المسافة البادئة

بينما ($x< ($tab_depth * 2)) :

$x++; في نهاية المطاف؛

مطبعة "

".basename($file)."
";

// عداد الزيادة

// استدعاء متكرر إلى Display_directory ()

Display_directory($file, $folder_location, $using_linux, $init_عمق);

// ليس دليلا

// أنشئ مسارًا وفقًا لقواعد الاستخدام

// نظام التشغيل.

إذا ($using_linux == 0):

$tab_عمق = ($current_عمق - $init_عمق) - 2؛ $س = 0;

// حساب المسافة البادئة

بينما ($x< (($tab_depth * 2) + 5)) :

مطبعة " ".basename($file)."
";

مطبعة " ".basename($file)."
";

إنهاء إذا؛ // Is_dir(ملف) endif: // If ! "." أو ".."

// أغلق الدليل Closeir($dh);

<? print "$page_name"; ?>

// حساب الحشو الأولي

إذا ($using_linux == 0):

$عمق = تنفجر("\\"، $beg_path);

$عمق = تنفجر("/", $beg_path);

$init_عمق = حجم($عمق);

Display_directory($beg_path, $folder_location, $using_linux, $init_عمق);

في التين. يوضح الشكل 7.1 نتيجة تشغيل البرنامج النصي لدليل يحتوي على عدة فصول من هذا الكتاب.

أرز. 7.1. عرض بنية الدليل على الخادم باستخدام البرنامج النصي sitemap.php

نتائج

قدم هذا الفصل العديد من أدوات PHP للتعامل مع الملفات. وعلى وجه الخصوص، نظرنا في القضايا التالية:

  • التحقق من وجود الملفات؛
  • فتح وإغلاق الملفات وتدفقات الإدخال/الإخراج؛
  • الكتابة إلى الملف والقراءة منه؛
  • إعادة توجيه الملف إلى دفق الإخراج؛
  • إطلاق برامج خارجية؛
  • عمليات نظام الملفات.

المواد الموجودة في هذا الفصل تمهد الطريق للفصل التالي، "السلاسل والتعبيرات العادية"، لأنه عند تطوير تطبيقات الويب، ترتبط معالجة السلاسل وعمليات الإدخال / الإخراج ارتباطًا وثيقًا.

(PHP 4 >= 4.3.0، PHP 5، PHP 7)

file_get_contents — يقرأ محتويات الملف في سلسلة

وصف

خيط file_get_contents (سلسلة اسم الملف $ [, منطقي $use_include_path = false [, المصدر $السياق [, إزاحة $ = -1 [, كثافة العمليات $ماكسلين ]]]])

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

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

تعليق:

إذا كنت تفتح عنوان URI يحتوي على أحرف خاصة مثل المسافة، فستحتاج إلى تشفير URI باستخدام كود urlen().

قائمة المعلمات

اسم الملف الذي تتم قراءته.

Use_include_path

تعليق:

منذ PHP 5 يمكنك استخدام الثابت FILE_USE_INCLUDE_PATHللبحث عن ملف في مسار التضمين.

سياق

مورد سياق صالح تم إنشاؤه باستخدام الوظيفة Stream_context_create(). إذا لم تكن هناك حاجة لاستخدام سياق خاص، فيمكنك تخطي هذه المعلمة عن طريق تمرير القيمة باطل.

الإزاحة التي ستبدأ عندها قراءة الدفق الأصلي.

بحث الأوفست غير مدعوم عند العمل مع الملفات البعيدة. محاولة العثور على إزاحة في الملفات غير المحلية قد تنجح في الإزاحات الصغيرة، لكن النتيجة لا يمكن التنبؤ بها لأنها تعمل على دفق مخزّن.

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

إرجاع القيم

تقوم الدالة بإرجاع بيانات القراءة أو خطأ شنيعفي حالة وجود خطأ.

انتباه

يمكن أن تعود هذه الوظيفة كقيمة منطقية خطأ شنيع، وقيمة غير منطقية يتم إرسالها إليها خطأ شنيع. لمزيد من المعلومات، راجع قسم النوع المنطقي. استخدم عامل التشغيل === للتحقق من القيمة التي يتم إرجاعها بواسطة هذه الوظيفة.

أخطاء

سيتم إنشاء خطأ في المستوى تحذير إلكتروني، إذا تعذر العثور على معلمة اسم الملف، أو كانت معلمة maxlength أقل من الصفر، أو فشل البحث في إزاحة الإزاحة في الدفق.

أمثلة

المثال رقم 1: احصل على الكود المصدري للصفحة الرئيسية لموقع الويب وعرضه

$الصفحة الرئيسية = file_get_contents("http://www.example.com/");
صدى الصفحة الرئيسية $ ؛
?>

المثال رقم 2: البحث عن الملفات في include_path

// <= PHP 5
$file = file_get_contents("./people.txt" , صحيح );
//> بي إتش بي 5
$file = file_get_contents("./people.txt" , FILE_USE_INCLUDE_PATH );
?>

المثال رقم 3: قراءة قسم من الملف

// اقرأ 14 حرفًا، بدءًا من الحرف 21
$section = file_get_contents("./people.txt" , NULL , NULL , 20 , 14 );
var_dump($section);
?>

ستكون نتيجة تشغيل هذا المثال شيئًا مثل هذا:

سلسلة (14) "lle Bjori Ro"

المثال رقم 4: استخدام سياقات البث

// إنشاء موضوع
خيارات $ = صفيف (
"http" =>المصفوفة(
"الطريقة" => "الحصول على" ,
"header" => "لغة القبول: en\r\n" .
"ملف تعريف الارتباط: foo=bar\r\n"
);

$context =stream_context_create ($opts);

// افتح الملف باستخدام رؤوس HTTP الموضحة أعلاه
$file = file_get_contents ("http://www.example.com/"، false، $context)؛
?>

Close_notify. ستقوم PHP بالإبلاغ عن هذا كـ "SSL: خطأ بروتوكول فادح" لحظة وصولك إلى نهاية البيانات. للتغلب على هذه المشكلة، يجب عليك تعيين error_reporting على مستوى يستبعد E_WARNING. يمكن لإصدارات PHP 4.3.7 والإصدارات الأقدم اكتشاف وجود مشكلة في IIS على جانب الخادم عند فتح دفق باستخدام برنامج تضمين https://ولا يعرض تحذيرا. إذا كنت تستخدم fsockopen()من أجل خلق سل: //مأخذ التوصيل، تقع على عاتقك مسؤولية اكتشاف هذا التحذير وقمعه.

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

لإنشاء ملف في PHP في برنامج نصي قابل للتنفيذ، تحتاج فقط إلى تحديد بعض الوظائف:

دعونا نلقي نظرة على مثال:

$text = "نوع من النص للكتابة في الملف";
$fp = fopen("file.txt", "w");
fwrite($fp, $text);
fClose($fp);
?>

هنا يجب أن تعرف:

فوبين ()- وظيفة فتح الملف للقراءة أو الكتابة والتوضيحات؛

هذا التوضيح (معلمة الوضع للدالة fopen) مهم جدًا:

  • "ص" - فتح ملف في php فقط للقراءة. يتم وضع المؤشر في البداية.
  • "ص+" - فتح ملف في php للقراءة والكتابة. يتم وضع المؤشر في البداية. !!! - مع هذين الوضعين r وr+، يجب أن تكون الملفات قد تم إنشاؤها بالفعل (وإلا سيظهر خطأ تحذير: fopen(file.txt): فشل في فتح الدفق: لا يوجد مثل هذا الملف أو الدليل في ...)، ونحن نقرأ فقط أو تتاح لنا الفرصة للإضافة.
  • "ث" - يتم فتح الملف للكتابة فقط. يتم اقتطاع الملف إلى طول صفر - أي تتم الكتابة فوقه. تتم كتابة ما هو مطلوب ويتم وضع المؤشر في البداية.
  • "ث+" - يفتح ملفًا للكتابة والقراءة! والباقي هو نفسه كما في الوضع "w". !!! - في هذين الوضعين - إذا لم يتم إنشاء الملف - ستتم محاولة لإنشائه!
  • "أ" - افتح الملف للكتابة فقط. على عكس "w"، لا يقوم هذا الخيار بالكتابة فوق محتويات الملف، ولكنه يضع المؤشر في نهاية السطر ويضيف المحتوى الذي أردنا إضافته إلى النهاية.
  • "أ+" - فتح الملف للكتابة والقراءة.

com.fwrite($fp, $text) - وظيفة للكتابة إلى ملف في PHP - أي أن ما هو موجود في المتغير $text يتم كتابته إلى ملف موجود في المتغير $fp؛

com.f Close($fp) - وظيفة إغلاق الملف الذي كتبناه للمتغير $fp؛

يمكنك الآن بسهولة إنشاء ملفات بلغة php بشكل صحيح وفتحها للقراءة والتحرير.

إضافات ووظائف PHP مفيدة للعمل مع ملف مفتوح:

بينما(!feof($fp))(
$mytext = fgets($fp, 99);
صدى $mytext."
";
}

هنا تم استيفاء الشرط - "افعل هذا حتى الوصول إلى نهاية الملف" بينما(!feof($fp))

1. الوظيفة fgets($fp, 99) - يسمح لك بتقسيم كل المحتوى إلى أقسام بحجم 99 بايت وأكثر، ولرؤية ذلك بشكل أكثر وضوحًا نضع علامة

وظيفة هذه السلسلة fgets(مقبض المورد [, int length]) يقبل بشكل افتراضي 1024 بايت (1 كيلو بايت) كمعلمة للطول، وإذا لم يتم تحديده فسيكون كذلك. هذه المعلمة اختيارية اعتبارًا من PHP 4.2.0 (إرجاع FALSE في حالة حدوث خطأ)

وظائف إضافية لفتح وكتابة وإنشاء ملف

الوظيفة - كثافة العمليات إقرا الملف(اسم ملف السلسلة [، bool use_include_path [، سياق المورد]]) - اقرأ الملف ككل.

يقرأ الملف ويكتب محتوياته إلى المخزن المؤقت للإخراج. ويقوم بإرجاع عدد البايتات الناتجة. في حالة وجود خطأ، سيعود إذا لم يتم استخدام الكلب - @readfile.

سيحدث شيء مثل هذا:

وفي نهاية الكلمة هناك علامة
.

ب. الوظيفة - المصفوفة ملف(اسم ملف السلسلة [، int use_include_path [، سياق المورد]])، يفعل نفس وظيفة readfile، مع استثناء واحد يضيف محتويات الملف إلى صفيف:

بهذه الطريقة يمكنك قراءة أي صفحات على الإنترنت: $lines = file("http://site/"); والتكرار عبر المصفوفة باستخدام الدالة foreach؛

3 أ. وظيفة السلسلة file_get_contents(اسم ملف السلسلة [، bool use_include_path [، سياق المورد [، int offset [، int maxlen]]]] - يسمح لك بالحصول على المحتويات كسلسلة واحدة.

هذه وظيفة PHP أكثر عالمية لقراءة ملف، تشبه وظيفة الملف، حيث يتم إرجاع المحتويات فقط كسلسلة، وليس مصفوفة، ويمكنك تعيين الشروط - أي بايت تبدأ به - عوضوأين تنتهي - maxlen. عند الفشل، سيتم إرجاع FALSE.

مهم!!!- في هذه الحالة، تقوم الدالة باستبدال 3 في وقت واحد: fopen()، fread() وfclose() وبالتالي تتخلص من العلامة.

3ب. وظيفة كثافة العمليات file_put_contents(اسم ملف السلسلة، البيانات المختلطة [، إشارات int [، سياق المورد]]) - مطابقة للاستدعاءات التسلسلية للوظائف fopen () وfwrite () وf Close () - تُرجع عدد البايتات المكتوبة.

آخر تحديث: 11/1/2015

مثل معظم لغات البرمجة، تدعم PHP العمل مع الملفات، وهي إحدى طرق تخزين المعلومات.

قراءة وكتابة الملفات

فتح وإغلاق الملفات

لفتح الملفات في PHP، يتم تعريف الدالة fopen(). يحتوي على التعريف التالي: المورد fopen(string $filename, string $mode) . تمثل المعلمة الأولى $filename المسار إلى الملف، والثانية هي وضع الفتح. اعتمادًا على الغرض من الفتح ونوع الملف، يمكن أن تأخذ هذه المعلمة القيم التالية:

    "r" : يتم فتح الملف للقراءة فقط. إذا كان الملف غير موجود، فسيتم إرجاع خطأ

    "r+" : الملف مفتوح للقراءة فقط وقابل للكتابة. إذا كان الملف غير موجود، فسيتم إرجاع خطأ

    "w" : الملف مفتوح للكتابة. إذا كان هذا الملف موجودا بالفعل، فسيتم الكتابة فوقه، إذا لم يكن كذلك، فسيتم إنشاؤه.

    "w+" : الملف مفتوح للكتابة والقراءة. إذا كان هذا الملف موجودا بالفعل، فسيتم الكتابة فوقه، إذا لم يكن كذلك، فسيتم إنشاؤه.

    "أ" : الملف مفتوح للكتابة. إذا كان هذا الملف موجودًا بالفعل، فسيتم كتابة البيانات في نهاية الملف، وتبقى البيانات القديمة. إذا لم يكن الملف موجودا، يتم إنشاؤه

    "a+" : يتم فتح الملف للقراءة والكتابة. إذا كان الملف موجودًا بالفعل، فسيتم إلحاق البيانات بنهاية الملف. إذا لم يكن الملف موجودا، يتم إنشاؤه

سيكون مخرج الدالة fopen عبارة عن واصف ملف. يتم استخدام هذا المؤشر لعمليات الملف ولإغلاق الملف.

بعد الانتهاء من العمل، يجب إغلاق الملف باستخدام الدالة fClose()، التي تأخذ واصف الملف كمعلمة. على سبيل المثال، لنفتح ونغلق ملفًا:

$fd = fopen("form.php", "r") أو die("تعذر فتح الملف"); فكلوز($fd);

يسمح إنشاء or die("error text") للبرنامج النصي بإيقاف التشغيل وعرض بعض رسائل الخطأ إذا كانت وظيفة fopen غير قادرة على فتح الملف.

قراءة ملف

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

في كل مرة يتم فيها استدعاء fgets()، ستضع PHP المؤشر في نهاية السطر المقروء. لتتبع نهاية الملف، يتم استخدام الدالة feof()، والتي ترجع صحيحًا عند اكتمال الملف. وحتى يتم الوصول إلى نهاية الملف، يمكننا استخدام الدالة fgets().

قراءة الملف بأكمله

في هذه الحالة، ليس علينا فتح الملف بشكل صريح، والحصول على مؤشر، ثم إغلاق الملف.

منع القراءة

يمكنك أيضًا إجراء قراءة كتلة تلو الأخرى، أي قراءة عدد معين من البايتات من ملف باستخدام الدالة fread() :

تأخذ الدالة fread() معلمتين: مؤشر الملف المراد قراءته وعدد البايتات المراد قراءتها. عند قراءة كتلة، يتحرك المؤشر الموجود في الملف إلى نهاية تلك الكتلة. وأيضًا باستخدام الدالة feof() يمكنك تتبع اكتمال الملف.

اكتب ملفا

لكتابة ملف، استخدم الدالة fwrite()، التي تكتب السطر التالي إلى الملف:

تعمل دالة fputs() أخرى بالمثل:

العمل مع مؤشر الملف

عند فتح ملف للقراءة أو الكتابة في الوضع "w"، يتم وضع المؤشر في الملف في البداية. عند قراءة البيانات، تقوم PHP بتحريك المؤشر في الملف إلى نهاية كتلة البيانات المقروءة. ومع ذلك، يمكننا أيضًا التعامل يدويًا مع المؤشر الموجود في الملف وتعيينه في موقع عشوائي. للقيام بذلك تحتاج إلى استخدام الوظيفة com.fseek، والذي يحتوي على التعريف الرسمي التالي:

Int fseek (مقبض المورد $، int $offset [، int $whence = SEEK_SET ])

تمثل المعلمة $handle مؤشر ملف. المعلمة $offset هي الإزاحة بالبايت بالنسبة لبداية الملف الذي ستبدأ القراءة/الكتابة منه. تحدد المعلمة الاختيارية الثالثة كيفية تعيين الإزاحة. يمكن أن يستغرق ثلاث قيم:

    SEEK_SET: القيمة الافتراضية، تقوم بتعيين الإزاحة في بايتات الإزاحة بالنسبة إلى بداية الملف

    SEEK_CUR : يضبط الإزاحة في وحدات البايت الإزاحة بالنسبة إلى بداية الموضع الحالي في الملف

    SEEK_END : يضبط الإزاحة لإزاحة البايتات من نهاية الملف

إذا تم تثبيت المؤشر بنجاح، ترجع الدالة fseek() 0، وإذا كان المؤشر غير ناجح، فإنها ترجع -1.

مثال لاستخدام الدالة:

$fd = fopen("hello.txt", "w+") أو die("تعذر فتح الملف"); $str = "مرحبا بالعالم!"; // السطر المراد كتابته fwrite($fd, $str); // اكتب السطر إلى البداية fseek($fd, 0); // ضع مؤشر الملف في البداية fwrite($fd, "Oink"); // اكتب السطر في البداية fseek($fd, 0, SEEK_END); // ضع المؤشر في النهاية fwrite($fd, $str); // اكتب سطرًا آخر في النهاية f Close($fd);