ویژگی تصویر

تابع zip_entry_compressedsize() در PHP

  /  PHP   /  تابع zip_entry_compressedsize() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع zip_entry_compressedsize() یکی از توابع قدیمیِ مرتبط با کار با فایل‌های ZIP در PHP است که اندازه‌ی داده فشرده‌شده (compressed size) یک ورودی (entry) در آرشیو ZIP را به بایت برمی‌گرداند. در این مقاله به طور دقیق عملکرد، مقدار بازگشتی، مثال‌های کاربردی، خطاها و جایگزین‌های مدرن مانند ZipArchive را بررسی می‌کنیم تا بتوانید در پروژه‌های واقعی از آن به‌درستی استفاده کنید.

چه زمانی از این تابع استفاده کنیم؟

  • وقتی از توابع سطح پایین PHP مانند zip_open و zip_read استفاده می‌کنید.
  • وقتی نیاز دارید اندازه‌ی فشرده یک فایل داخل آرشیو را بدون استخراج کامل بدانید.
  • برای گزارش‌گیری، مانیتورینگ فضای ذخیره یا مقایسه بین اندازه فشرده و غیر فشرده (ratio).

امضای تابع و مقدار بازگشتی

امضاتوضیح
zip_entry_compressedsize(resource $zip_entry)اندازه‌ی داده‌ی فشرده‌شده به بایت را برمی‌گرداند یا false در صورت خطا.

نکات مهم:

  • بازگشتی یک عدد صحیح (integer) یا false است؛ بنابراین در بررسی نتیجه باید از مقایسه سخت (=== false) استفاده کنید.
  • برای فایل‌های خیلی بزرگ ممکن است مسألهٔ overflow روی سیستم‌های 32 بیتی رخ دهد.

مثال پایه با توابع zip_* (قدیمی)

$zip = zip_open('archive.zip');

if ($zip === false) {
    die('Cannot open archive.zip');
}

while ($entry = zip_read($zip)) {
    $name = zip_entry_name($entry);
    $compressed = zip_entry_compressedsize($entry);
    $uncompressed = zip_entry_filesize($entry);

    if ($compressed === false) {
        echo "Cannot get compressed size for: $namen";
    } else {
        echo "Entry: $name, Compressed: $compressed bytes, Uncompressed: $uncompressed bytesn";
    }
}

zip_close($zip);

توضیح: این کد آرشیو را با zip_open باز می‌کند، با zip_read هر ورودی را می‌خواند و سپس اندازهٔ فشرده و غیرفشرده را با توابع مربوطه دریافت می‌کند. در صورت شکست گرفتن اندازهٔ فشرده، پیغام خطا چاپ می‌شود. توجه کنید که این خانوادهٔ توابع قدیمی‌تر است و استفاده از آن‌ها کمتر توصیه می‌شود مگر دلیل مشخصی داشته باشید.

مثال معادل و توصیه‌شده با ZipArchive

$za = new ZipArchive();
if ($za->open('archive.zip') === TRUE) {
    for ($i = 0; $i numFiles; $i++) {
        $stat = $za->statIndex($i);
        $name = $stat['name'];
        $compressed = $stat['comp_size'];
        $uncompressed = $stat['size'];
        echo "Entry: $name, Compressed: $compressed bytes, Uncompressed: $uncompressed bytesn";
    }
    $za->close();
} else {
    echo "Unable to open archive.zipn";
}

توضیح: ZipArchive رابط مدرن‌تر و پایدارتری برای کار با ZIP است. متد statIndex یا statName اطلاعاتی مانند comp_size و size را برمی‌گرداند که معادلِ zip_entry_compressedsize() و zip_entry_filesize() هستند.

تفاوت‌ها و چرا ZipArchive بهتر است

  • سازگاری و پایداری بیشتر در نسخه‌های جدید PHP.
  • پشتیبانی بهتر از ZIP64 و فایل‌های بزرگ (بستگی به نسخهٔ libzip نصب‌شده روی سرور دارد).
  • رابط شیءگرا، متدهای بیشتر و مدیریت خطا واضح‌تر.
  • عملکرد بهتر در بسیاری از موارد و مستندات گسترده‌تر.

موارد فنی و نکات پیشرفته

  • اگر مقدار فشرده برابر با اندازهٔ غیرفشرده بود، معمولاً به این معنی است که فایل با روش “stored” (بدون فشرده‌سازی) ذخیره شده است.
  • در سیستم‌های 32 بیتی، مقادیر خیلی بزرگ ممکن است دچار overflow شوند. برای فایل‌های بزرگ توصیه می‌شود از PHP 7/8 روی سیستم 64 بیتی و ZipArchive با libzip مدرن استفاده کنید.
  • تابع zip_entry_compressedsize() بدون باز کردن ورودی با zip_entry_open() معمولاً کار می‌کند زیرا اطلاعات متادیتای ورودی را از header می‌خواند؛ اما برای خواندن محتوا باید ورودی را باز کنید.
  • بازنگری و چک کردن مقدار برگشتی: همیشه از === false برای تشخیص خطا استفاده کنید تا صفر بودن اندازه (برای فایل خالی) با خطا اشتباه گرفته نشود.

نمونه جدول بازگشتی و رفتارها

وضعیتنتیجه تابعتوضیح
موفقintegerاندازهٔ فشرده به بایت
ورودی نامعتبر یا خطاfalseخطا — باید بررسی شود
فایل خالی0فایل بدون محتوا

خطاهای رایج و رفع آن‌ها

  • باز کردن نشدن آرشیو: مطمئن شوید مسیر فایل درست است و دسترسی خواندن دارید.
  • مقدار false: بررسی کنید ورودی از zip_read مقدار معتبری برگردانده باشد و از مقایسهٔ سخت استفاده کنید.
  • مشکلات Overflow: از PHP و سیستم 64 بیتی و ZipArchive با libzip به‌روز استفاده کنید.

جمع‌بندی و توصیه‌ها

تابع zip_entry_compressedsize() برای دستیابی سریع به اندازهٔ فشرده‌ی یک فایل داخل آرشیو مناسب است، اما به دلیل قدیمی بودن مجموعه توابع zip_*، توصیه می‌شود در پروژه‌های جدید از ZipArchive استفاده کنید. اگر مجبور به استفاده از توابع قدیمی هستید، حتماً خطاها و overflow را مدیریت کنید و در صورت نیاز به پشتیبانی از فایل‌های بزرگ، محیط اجرای PHP و نسخهٔ libzip را بررسی کنید.

در پایان، هنگام پیاده‌سازی قابلیت‌هایی مانند گزارش‌گیری فضای فشرده، مقایسهٔ نرخ فشرده‌سازی یا مانیتورینگ آرشیوها، ابتدا با چند فایل نمونه تست کنید تا رفتار در مورد فایل‌های کوچک، خالی و بزرگ را بسنجید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: