مقدمة في العمل مع أرشيفات ZIP في PHP
أرشفة البيانات هي إحدى المهام الأساسية في تطوير الويب. سواء كان الأمر يتعلق بنسخ احتياطي لقاعدة البيانات، أو تغليف الملفات التي رفعها المستخدم، أو تصدير كمية كبيرة من المعلومات - يظل تنسيق ZIP الحل الأكثر شيوعًا وتعددًا للاستخدامات. توفر PHP فئة مدمجة ZipArchive تتيح لك تنفيذ جميع العمليات الأساسية مع أرشيفات ZIP دون الحاجة إلى تثبيت إضافات إضافية.
في هذه المقالة، سنشرح بالتفصيل كيفية استخدام ZipArchive في PHP: بدءًا من إنشاء أرشيف بسيط وحتى معالجة المجلدات المتداخلة والحماية بكلمة مرور. جميع أمثلة الكود جاهزة للاستخدام على الخادم الخاص بك.
التحضير للعمل: التحقق من إضافة Zip
قبل البدء، تأكد من تمكين إضافة zip على الخادم الخاص بك. عادةً ما تكون مثبتة افتراضيًا في الإصدارات الحديثة من PHP (7.4+، 8.x). يمكنك التحقق من ذلك باستخدام الدالة phpinfo() أو برنامج نصي بسيط:
<?phpif (extension_loaded('zip')) { echo 'إضافة Zip متاحة';} else { echo 'إضافة Zip غير موجودة. قم بتثبيتها عبر php.ini';}?>إنشاء أرشيف ZIP في PHP
الخطوة 1. تهيئة كائن ZipArchive
للبدء، قم بإنشاء مثيل للفئة ZipArchive وافتح أرشيفًا جديدًا باستخدام الدالة open(). المعامل الثاني - العلامة ZipArchive::CREATE - تشير إلى أنه سيتم إنشاء الأرشيف من جديد (أو استبداله إذا كان موجودًا بالفعل).
<?php$zip = new ZipArchive();$zipName = 'example.zip';
if ($zip->open($zipName, ZipArchive::CREATE) !== TRUE) { exit("فشل إنشاء الأرشيف $zipName");}?>الخطوة 2. إضافة الملفات إلى الأرشيف
الدالة addFile() تضيف ملفًا موجودًا من نظام الملفات. الوسيطة الأولى هي المسار إلى الملف، والثانية (اختيارية) هي اسم الملف داخل الأرشيف (إذا كنت تريد إعادة تسميته).
<?php// إضافة ملف واحد$zip->addFile('document.pdf', 'my_document.pdf');
// إضافة عدة ملفات$files = ['photo1.jpg', 'photo2.jpg', 'photo3.jpg'];foreach ($files as $file) { $zip->addFile($file);}?>الخطوة 3. إضافة مجلد كامل مع الحفاظ على الهيكل
إذا كنت بحاجة إلى ضغط دليل بجميع الملفات المتداخلة فيه، استخدم المسح التكراري. إليك دالة جاهزة:
<?phpfunction addFolderToZip($zip, $folder, $parentFolder = '') { $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($folder), RecursiveIteratorIterator::LEAVES_ONLY );
foreach ($files as $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = $parentFolder . $file->getFilename(); $zip->addFile($filePath, $relativePath); } }}
// الاستخدام:$zip->addEmptyDir('my_folder'); // إنشاء مجلد في الأرشيفaddFolderToZip($zip, '/path/to/source_folder', 'my_folder/');?>الخطوة 4. إغلاق الأرشيف
بعد إضافة جميع الملفات، تأكد من إغلاق الأرشيف - وإلا فلن يتم حفظ البيانات.
<?php$zip->close();echo "تم إنشاء الأرشيف $zipName بنجاح!";?>فك ضغط أرشيف ZIP في PHP
لاستخراج الملفات، تُستخدم الدالة extractTo(). حدد المجلد الهدف الذي سيتم فك ضغط الملفات إليه.
<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) { $zip->extractTo('/path/to/extract_folder/'); $zip->close(); echo 'تم فك ضغط الأرشيف بنجاح';} else { echo 'خطأ في فتح الأرشيف';}?>الإمكانيات المتقدمة لـ ZipArchive
إضافة سلسلة نصية كملف
الدالة addFromString() تتيح لك إنشاء ملف مباشرة من سلسلة نصية