في هذا الدرس 6تصفّح المواضيع
قبل توليد النسخ الاحتياطية الكبيرة أو تصدير الملفات الضخمة، افحص سعة القسم المتاحة والكلية عبر disk_free_space() وdisk_total_space().
- تُرجع كلتا الدالتين عدد البايتات كعدد عشري
floatلضمان عدم حدوث طفح رقمي في الأقراص التي تبلغ سعتها عدة تيرابايت. - اقسم عدد البايتات على
1024 ** 3(أو1073741824) لتحويل البايتات الخام إلى جيجابايت مقروء (GiB). - تحقق دائماً من أن المساحة الحرة تتجاوز حداً آمناً قبل البدء بكتابة ملفات كبيرة.
تُرجع disk_free_space() وdisk_total_space() عدد البايتات العشري لنظام الملفات الذي يستضيف المجلد __DIR__.
<?php
$dir = __DIR__;
$freeBytes = disk_free_space($dir);
$totalBytes = disk_total_space($dir);
$usedPct = round((1 - ($freeBytes / $totalBytes)) * 100, 1);
$freeGb = round($freeBytes / (1024 ** 3), 2);
echo "Free: " . ($freeGb > 0 ? "OK" : "LOW") . " | UsedPct: " . ($usedPct >= 0 ? "VALID" : "ERR") . "\n";
يوفر PHP دوال سريعة لقراءة البيانات الوصفية مثل filesize() وfiletype() وfilemtime() لفحص الملفات دون تحميل محتواها في الذاكرة.
- تُرجع
filesize($path)الحجم الدقيق بالبايت، بينما تُرجعfiletype($path)نوع العنصر مثل"file"أو"dir"أو"link". - تُرجع
filemtime($path)الطابع الزمني (Unix Timestamp) لآخر تعديل على المحتوى، وهو مثالي لتحديث الكاش وإصدارات الملفات. - نسّق الرقم الصحيح الناتج عن
filemtime()باستخدامdate("Y-m-d H:i:s", $mtime)لعرضه بصيغة مقروءة.
النص المكون من 16 بايت يعطي حجماً قدره 16 ونوع "file" وطابعاً زمنياً صالحاً لوقت التعديل.
<?php
$tmp = sys_get_temp_dir() . '/ct_meta.txt';
file_put_contents($tmp, "CloseTag PHP 8.4");
$size = filesize($tmp);
$type = filetype($tmp);
$hasMtime = filemtime($tmp) > 1700000000 ? 'yes' : 'no';
echo "Size: $size B | Type: $type | Recent: $hasMtime\n";
unlink($tmp);
تُضبط صلاحيات الملفات عبر الدالة chmod() باستخدام رقم ثماني (Octal)، وتُفحص عبر fileperms() مع تحديث ذاكرة الحالة بـ clearstatcache().
- مرّر دائماً رقماً ثمانياً يبدأ بصفر على اليسار (مثل
0644أو0600)، ولا تمرّره كنص"0644"أو رقم عشري644. - نسّق القيمة الناتجة من
fileperms($path)عبرsubstr(sprintf("%o", fileperms($path)), -4)لاستخراج الأرقام الثمانية الأربعة. - نظراً لأن PHP يخزن بيانات حالة الملفات مؤقتاً لتسريع الأداء، استدعِ
clearstatcache(true, $path)بعد تعديل الصلاحيات أو الحجم.
تضبط chmod($tmp, 0644) صلاحيات القراءة والكتابة، وتنعش clearstatcache(true, $tmp) الذاكرة المؤقتة، وتنسق sprintf("%o", ...) الصلاحيات الثمانية.
<?php
$tmp = sys_get_temp_dir() . '/ct_perm.txt';
file_put_contents($tmp, "secret");
chmod($tmp, 0644);
clearstatcache(true, $tmp);
$octal = substr(sprintf('%o', fileperms($tmp)), -4);
echo "Octal length: " . strlen($octal) . " | Readable: " . (is_readable($tmp) ? 'yes' : 'no') . "\n";
unlink($tmp);
استخدم الدالة copy() لإنشاء نسخة مطابقة من الملف في مسار احتياطي، وrename() لنقل الملف أو استبداله ذرياً.
- تنسخ الدالة
copy($source, $dest)محتوى الملف بالكامل وتستبدل الملف الهدف$destإذا كان موجوداً مسبقاً. - تُعيد الدالة
rename($oldPath, $newPath)تسمية الملف أو تنقله بين المجلدات على نفس نظام الملفات كعملية ذرية (Atomic). - الكتابة في ملف مؤقت أولاً ثم استدعاء
rename($tmpFile, $liveFile)تضمن عدم قراءة أي مستخدم لملف غير مكتمل الكتابة.
تنسخ copy() المسودة إلى $bak، وتنقل rename() الملف الأصلي إلى $live بحيث يختفي مسار المسودة القديم.
<?php
$dir = sys_get_temp_dir();
$src = "$dir/ct_draft.txt";
$bak = "$dir/ct_backup.txt";
$live = "$dir/ct_live.txt";
file_put_contents($src, "v2.0");
copy($src, $bak);
rename($src, $live);
echo "Live: " . file_get_contents($live) . " | Draft exists: " . (file_exists($src) ? 'yes' : 'no') . "\n";
unlink($bak);
unlink($live);
يحذف PHP الملفات من نظام التشغيل عبر الدالة unlink()، وهي مستمدة من استدعاء النظام POSIX الذي يفك ارتباط اسم الملف ببياناته على القرص.
- تحقق من أن المسار يمثل ملفاً عادياً عبر
is_file($path)وأنه قابل للتعديل عبرis_writable($path)قبل استدعاءunlink($path). - لا تستخدم
unlink()لحذف المجلدات؛ فالمجلدات تُحذف عبر الدالة المخصصةrmdir(). - لا تمرّر مدخلات المستخدم الخام مباشرة إلى
unlink()دون التحقق من المسار، وإلا قد يتمكن المهاجم من حذف ملفات النظام الحساسة.
فحص is_file($tmp) وis_writable($tmp) يتجنب التحذيرات على المسارات المفقودة قبل أن تحذف unlink($tmp) الملف نهائياً.
<?php
$tmp = sys_get_temp_dir() . '/ct_temp_cache.tmp';
file_put_contents($tmp, "expired-cache");
$deleted = false;
if (is_file($tmp) && is_writable($tmp)) {
$deleted = unlink($tmp);
}
echo "Deleted: " . ($deleted ? 'yes' : 'no') . " | Exists: " . (file_exists($tmp) ? 'yes' : 'no') . "\n";
اجمع بين دوال فحص البيانات الوصفية وتفريغ ذاكرة الحالة المؤقتة والعمليات الذرية للحفاظ على موثوقية التخزين على الخادم.
- الدوال مثل
filesize()وfilemtime()وfileperms()وis_file()تُحفظ نتائجها مؤقتاً حتى تستدعيclearstatcache(). - استخدم الصلاحية الثمانية
0644للملفات العادية غير التنفيذية، و0600لملفات الإعدادات والمفاتيح السرية الخاصة. - اعتمد على الاستبدال الذري بالدالة
rename()عند تحديث ملفات الكاش أو الإعدادات الحية التي يقرؤها الزوار في نفس الوقت.
استدعاء clearstatcache(true, $tmp) يضمن أن القراءة الثانية للدالة filesize($tmp) تجلب الحجم المحدث (18 بايت) من نظام التشغيل.
| الدالة | الوظيفة الأساسية | نوع الإرجاع | تُخزن في Stat Cache؟ |
|---|---|---|---|
disk_free_space($dir) | Available bytes on partition | float|false | No |
filesize($path) / filemtime($path) | Byte size / Last modified timestamp | int|false | Yes |
chmod($path, 0644) | Set octal permissions | bool | Clears automatically |
copy($s, $d) / rename($s, $d) / unlink($p) | Duplicate / Move / Delete file | bool | Clears target stat |
<?php
$tmp = sys_get_temp_dir() . '/ct_stat_demo.txt';
file_put_contents($tmp, "v1");
$s1 = filesize($tmp);
file_put_contents($tmp, "version-2-expanded");
clearstatcache(true, $tmp);
$s2 = filesize($tmp);
echo "Before: $s1 B -> After: $s2 B\n";
unlink($tmp);
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
اجمع بين دوال فحص البيانات الوصفية وتفريغ ذاكرة الحالة المؤقتة والعمليات الذرية للحفاظ على موثوقية التخزين على الخادم. الدوال مثل filesize() وfilemtime() وfileperms() وis_file() تُحفظ نتائجها مؤقتاً حتى تستدعي clearstatcache(). استخدم الصلاحية الثمانية 0644 للملفات العادية غير التنفيذية، و0600 لملفات الإعدادات والمفاتيح السرية الخاصة. اعتمد على الاستبدال الذري بالدالة rename() عند تحديث ملفات الكاش أو الإعدادات الحية التي يقرؤها الزوار في نفس الوقت.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Permissions & Disk I/O الصلاحيات والنسخ والحذف
- افحص مساحة القرص وأحجام الملفات وتواريخ تعديلها، وأدر الصلاحيات بـ chmod وfileperms، وانسخ وانقل واحذف الملفات بأمان في PHP 8.
- للمراجعة
- 02 Checking Disk Free and Total Space قياس المساحة الكلية والمتاحة بـ disk_free_space
- المفهوم الأساسي لقسم قياس المساحة الكلية والمتاحة بـ disk_free_space في لغة PHP الحديثة.
- للمراجعة
- 03 Inspecting File Size Type and mtime فحص حجم الملف ونوعه ووقت آخر تعديل filesize و filemtime
- الصياغة البرمجية والتطبيق العملي المباشر لقسم فحص حجم الملف ونوعه ووقت آخر تعديل filesize و filemtime.
- للمراجعة
- 04 Managing Octal Permissions with chmod تعديل وقراءة الصلاحيات بـ chmod و fileperms و clearstatcache
- قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم تعديل وقراءة الصلاحيات بـ chmod و fileperms و clearstatcache.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 PHP PHP
- PHP: Hypertext Preprocessor
- لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
- للمراجعة
- 02 CLI CLI
- Command-Line Interface
- واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
- للمراجعة
- 03 FPM FPM
- FastCGI Process Manager
- مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
- للمراجعة
- 04 HTML HTML
- HyperText Markup Language
- لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم قياس المساحة الكلية والمتاحة بـ disk_free_space للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم فحص حجم الملف ونوعه ووقت آخر تعديل filesize و filemtime وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
ما نوع البيانات الذي تُرجعه الدالتان disk_free_space() وdisk_total_space() عند النجاح؟
إرجاع float يمنع تجاوز سعة الأعداد الصحيحة في الأقراص الكبيرة.
كيف يجب تمرير معامل الصلاحيات في chmod($path, $permissions) لمنح المالك القراءة والكتابة والبقية القراءة فقط؟
تتطلب chmod() عدداً صحيحاً مكتوباً بالنظام الثماني.
لماذا قد تُرجع filesize($path) حجماً قديماً بعد تعديل الملف أثناء نفس دورة تنفيذ السكريبت؟
يحفظ PHP البيانات الوصفية مؤقتاً لتسريع الأداء، وتقوم clearstatcache(true, $path) بتحديثها.
ما الدالة المدمجة في PHP المسؤولة عن حذف ملف عادي من نظام الملفات؟
تحذف الدالة unlink() الملف من نظام الملفات.
ماذا تُرجع الدالة filemtime($path)؟
تُرجع filemtime() وقت آخر تعديل بالثواني منذ عصر يونكس.
كيف يمكنك تحديث ملف إعدادات حي بشكل ذري (Atomic) بحيث لا يقرأ أي زائر ملفاً ناقص الكتابة؟
عملية rename() على نفس نظام الملفات تبدل مؤشر الملف ذرياً في خطوة واحدة.
ماذا تفعل الدالة copy($source, $dest) إذا كان الملف الهدف $dest موجوداً مسبقاً وقابلاً للكتابة؟
تقوم copy() بالكتابة فوق الملف الهدف الموجود وإرجاع true.
أي تعبير برمجي يستخرج نص الصلاحيات الثماني المكون من 4 أرقام (مثل "0644") من الدالة fileperms($path)؟
تحول sprintf("%o", ...) الرقم إلى النظام الثماني وتقتطع substr(..., -4) آخر 4 أرقام للصلاحيات.