العمل مع أرشيفات ZIP في PHP: ZipArchive ومكتبات الضغط

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

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

ابدأ الدورة

مقدمة في العمل مع أرشيفات ZIP في PHP

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



على البوابة التعليمية PythonLib.ru، سنشرح جميع جوانب العمل مع ZIP في PHP: من العمليات الأساسية إلى التقنيات المتقدمة، بما في ذلك الضغط بكلمة مرور، ومعالجة كميات كبيرة من البيانات، والتكامل مع التخزين المؤقت للإخراج.



تثبيت والتحقق من إضافة Zip

فئة ZipArchive متاحة في PHP بدءًا من الإصدار 5.2.0. لاستخدامها، يجب التأكد من تفعيل إضافة zip في إعدادات الخادم. يمكن التحقق من ذلك باستخدام دالة phpinfo() أو من خلال سكريبت بسيط:



<?phpif (class_exists('ZipArchive')) {    echo "إضافة Zip متاحة";} else {    echo "إضافة Zip غير مثبتة";}?>


في معظم خدمات الاستضافة الحديثة، تكون الإضافة مثبتة مسبقًا. إذا لم تكن موجودة، تواصل مع مسؤول الخادم أو قم بتثبيتها عبر مدير الحزم (مثل apt-get install php-zip لأنظمة Debian/Ubuntu).



العمليات الأساسية مع ZipArchive

1. إنشاء أرشيف ZIP جديد

لإنشاء أرشيف، يتم استخدام الدالة open() مع العلم ZipArchive::CREATE. لنلق نظرة على مثال أساسي:



<?php$zip = new ZipArchive();$filename = 'example.zip';

if ($zip->open($filename, ZipArchive::CREATE) === TRUE) { // إضافة ملف من نص $zip->addFromString('hello.txt', 'مرحبًا بالعالم!'); // إضافة ملف موجود $zip->addFile('/path/to/image.jpg', 'images/photo.jpg'); // إضافة مجلد فارغ $zip->addEmptyDir('documents'); $zip->close(); echo "تم إنشاء الأرشيف بنجاح";} else { echo "خطأ في إنشاء الأرشيف";}?>


لاحظ: المعامل الثاني في addFile() يحدد المسار داخل الأرشيف، مما يسمح بتنظيم هيكل المجلدات.



2. فك ضغط أرشيف ZIP

لاستخراج جميع الملفات، يتم استخدام الدالة extractTo():



<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) {    $zip->extractTo('/destination/folder/');    $zip->close();    echo "تم فك ضغط الأرشيف";} else {    echo "تعذر فتح الأرشيف";}?>


يمكن أيضًا استخراج ملف معين فقط عن طريق تحديد مساره الداخلي كمعامل ثانٍ:

$zip->extractTo('/destination/', 'images/photo.jpg');


3. قراءة محتويات الأرشيف دون فك الضغط

في بعض الأحيان، نحتاج فقط إلى عرض قائمة الملفات داخل الأرشيف:



<?php$zip = new ZipArchive();if ($zip->open('archive.zip') === TRUE) {    for ($i = 0; $i < $zip->numFiles; $i++) {        $stat = $zip->statIndex($i);        echo "ملف: " . $stat['name'] . " (الحجم: " . $stat['size'] . " بايت)";    }    $zip->close();}?>


الدالة statIndex() تُرجع مصفوفة تحتوي على معلومات: الاسم، الحجم، تاريخ التعديل، CRC32 وبيانات وصفية أخرى.



الإمكانيات المتقدمة

الضغط بكلمة مرور (PHP 7.2+)

بدءًا من PHP 7.2، يدعم ZipArchive التشفير بكلمة مرور عبر خوارزمية AES-256:



<?php$zip = new ZipArchive();if ($zip->open('protected.zip', ZipArchive::CREATE) === TRUE) {    $zip->setPassword('supersecret');    $zip->addFile('document.pdf');    // تفعيل التشفير لآخر ملف تمت إضافته    $zip->setEncryptionName('document.pdf', ZipArchive::EM_AES_256);    $zip->close();    echo "تم إنشاء الأرشيف المشفر";?>

توصيات