(Diskte geçici bir dosya yaratmadan) PHP ile bellekte bir arşiv işleyin

4 Cevap php

Ben on-the-fly PHP bir arşiv oluşturmak ve onu (kaydetmeden) derhal kullanıcıya göndermek için çalışıyorum. Ben orada, ben yolluyorum veri zaten kalıcı değil gibi diskte bir dosya oluşturmak için gerek olurdu, ancak web'de arama üzerine, ben nasıl bulamadı düşündüm. Ben de dosya biçimi umurumda değil.

Yani, soru şudur:

Bu yol boyunca bir geçici dosya oluşturmadan bir php komut dosyası içinde bellekte bir dosya arşivi oluşturmak ve işlemek mümkün mü?

4 Cevap

Ben aynı sorun vardı ama nihayet biraz karanlık çözüm bulundu ve burada paylaşmaya karar verdi.

I phpmyadmin ile gelen ve "kütüphaneler" dizininde bulunan büyük zip.lib.php / unzip.lib.php komut genelinde geldi.

zip.lib.php benim için bir cazibe olarak çalıştı kullanma:

require_once(LIBS_DIR . 'zip.lib.php');

... 

//create the zip
$zip = new zipfile();

//add files to the zip, passing file contents, not actual files
$zip->addFile($file_content, $file_name);

...

//prepare the proper content type
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=my_archive.zip");
header("Content-Description: Files of an applicant");

//get the zip content and send it back to the browser
echo $zip->file();

Bu script gerçek dosyaları gibi dosyaları olan veya bir dosya olarak zip kendisi tasarruf gerek kalmadan, bir zip indirilmesini sağlar.

Bu işlevsellik, daha genel PHP kitaplığının parçası olmadığı bir ayıp değildir.

Here is a link to the zip.lib.php file from the phpmyadmin source: https://github.com/phpmyadmin/phpmyadmin/blob/master/libraries/zip.lib.php

UPDATE: Make sure you remove the following check from the beginning of zip.lib.php as otherwise the script just terminates:

if (! defined('PHPMYADMIN')) {
    exit;
}

ne arşivi oluşturmak için kullanıyorsunuz? Sen akışı php :/ / temp veya php kullanmak mümkün olabilir :/ okumak ve / arşivinden yazmak / bellek.

Bkz http://php.net/manual/en/wrappers.php.php

:/ / Temp bunu, sonra tekrar 0'a geri sarmak ve okumak, çıkış kızarma, onu açık tutmak deneyin kapattığınızda dışında sizin için çalışıyor php Yorumlarınız ilgili.

Daha fazla örnek için buraya bakınız: http://us.php.net/manual/en/function.tmpfile.php

Ayrıca araştırma çıktı tamponlama ve yakalama: http://us.php.net/manual/en/function.ob-start.php

Bir performans sorunu burada gerçekten var mı, yoksa sadece hakkaniyet duygunuzu rencide nedir? Süreçlerin bir sürü geçici dosyaları yazmak ve bunları silmek, ve genellikle nedeniyle önbelleğe alma için diski isabet asla.

Kapatıldığında bir geçici dosya otomatik olarak silinir. İşte bu doğası var.

Orada bellekte bir zip dosyası oluşturun ve o hizmet için aklıma sadece iki yolu vardır ve her ikisi de değer daha büyük olasılıkla daha fazla sorun vardır.

  • Bir ram disk kullanın.
  • modify the ziparchive class to add a method that does everything the close() method does, except actually close the file. (Or add a leave-open parameter to close()).
    This might not even be possible depending on the underlying C libraries.