PHP gzopen / gzwrite vs gzcompress

4 Cevap php

Ben gzip'li dosyaları üreten bir PHP komut dosyası yazıyorum. Kullanarak oldum yaklaşım yazısının sonunda bir dosyaya yazmadan önce PHP ve gzcompress bir dize () dize kadar inşa etmektir.

Şimdi büyük dosyalar ile benim komut test ve bellek ayırma hataları çalıştırıyorum. Bu sonuç, dize bir anda bellekte tutmak için çok büyük hale geliyor gibi görünüyor.

Bunu çözmek için ben PHP büyük bir dize tahsis önlemek için () ve gzwrite () gzopen kullanmayı denedim. Ancak, gzwrite ile oluşturulan gzip'li dosya () I gzcompress () kullandığınızda çok farklıdır. Ben farklı zip düzeylerde tecrübe ettik ama yardımcı olmuyor. Ben de gzdeflate kullanarak çalıştı () ve gzwrite (gibi aynı sonuçları ile sonuna kadar), ancak () gzcompress yine benzer ettik. Bu tüm dosya var, farklı sadece ilk iki bayt (zlib başlık) değil.

Gzcompress () PHP bu diğer gzip işlevler farklı ne yapar? Aşamalı sonucu üretirken I) gzcompress (sonuçlarını taklit bir yolu var mı?

4 Cevap

Ben% 100 emin değilim, ama benim tahminim gzcompress GZIP formatını kullanır ve gzopen / gzwrite kullanımı ZLIB olmasıdır. Dürüst olmak gerekirse, ben ikisi arasındaki fark ne olduğunu size söyleyemem, ama ben GZIP gerçek sıkıştırma için ZLIB kullandığı biliyorum.

O hiçbiri olsa önemi olasıdır. Gzopen / gzwrite ile gzip dosyası oluşturmayı deneyin ve ardından komut satırı gzip programı kullanarak sıkıştırın. Eğer çalışırsa, o gzopen / gzwrite kullanarak sizin için çalışacak.

Ben bir kez benzer bir sorun koştu - temelde iş yapmak için php tahsis yeterli ram yoktu.

Ben dosya sistemini kullanarak dosyayı gziplemek exec () kullanarak sonra, bir metin dosyası olarak dize tasarruf sona erdi. Onun değil ideal bir çözüm ama benim durum için çalıştı.

php.ini dosyasında memory_limit parametresini artırmayı deneyin

Temel fark gzwrite fonksiyonu 4 bayt sınırının çıkış (ya da 2) hangi edecek ped, SYNC_FLUSH seçeneği ile zlib'e başlatır, ve sonra biraz fazladan (0x00 0x00 0xff 0xff 0x03) olmasıdır.

Zip dosyaları oluşturmak için bu kullanıyorsanız, varsayılan Mac Arşiv programı bu biçimi değil kabul sakının.

Ne söyleyebilirim Kimden, SYNC_FLUSH bir gzip seçeneği ve PKZip / Info-ZIP formatında izin verilmez, tüm. Zip dosyaları ve bunların türevleri geliyor.

Tek bir saklamaktan blokta sonuçlanan küçük bir dosya / metin, söndürün ve gzwrite ile yazılmış aynı metin ile mukayese ederseniz, 2 farklılıkları, Söndür blok başlığında bayt biri 1 farklı olduğunu görürsünüz ve uç yukarıdaki bayt ile doldurulur. Sonuç tek saklamaktan bloktan daha büyükse, farklılıklar yığılmaya başlar. Sıkıştırma akımını blok başlıkları hizada bile bayt değil gibi, bu düzeltmek zordur. Herkes zlib'e kullanan bir nedeni var. Birkaç kişi bile bu biçimi yeniden denemek için yeterince cesur!