2011-08-02 17 views
6

Bunun mümkün olup olmadığından emin değilim, fakat artık akademik bir mücadele haline geldi. Bir PHP dosyasında ikili veri gömmek için __halt_compiler() hile kullanarakPHP zip_open() ve php: // temp, açılamıyor

, başarıyla fseek()__COMPILER_HALT_OFFSET__ için

( çok zor bu kesin örnek manuel belgelenmiştir olarak görülmemesi) bir otomatik açılan komut dosyası oluşturduktan

Her neyse, ikili Posta verilerinin küçük bir yumru ("merhaba dünya" diyor tek bir dosya içeren tek klasör) yapmak denedim ne __halt_compiler()

benim çağrısından sonra ise depoladığınız verileri doğrudan'ye kopyalayın 10 dere ve başarı ile bunu yapmış

$php = fopen(__FILE__, 'rb'); 
$tmp = fopen('php://temp', 'r+b'); 
fseek($php, __COMPILER_HALT_OFFSET__); 
stream_copy_to_stream($php, $tmp); 

Sorunum için şimdi açık php://tempzip_open()

ile çalışmaktan gelir ( Ben rewind() ve passthru() geçici akım kolu ise, verileri döker) diğer tür poss rağmen görebildiğim kadarıyla
$zip = zip_open('php://temp'); 

(Buradaki sorun, zip_open() ile akış desteğinin olmaması gibi problemlerdir. Buradaki problem, php://memory ve php://temp aktarımları arasındaki veri kalıcılığının olmamasıdır. Bu etrafta çalışılabilirse, belki de mümkündür.

Ben

var_dump($zip); // int(11) 

(diğer birçok olası hata kodları gibi görünüşte) üzerinde hiçbir dokümantasyon bulduk hata kodu 11, geri tekme tutar @cweiske işaret ettiği gibi, hata kodu 11 = ZipArchive::ER_OPEN, Dosya açılamıyor

Bu sonuç, php://temp akışını veya başka bir olası sorunu kullanmama yönelik girişimin sonucu mu? Ayrıca bir OOP yaklaşımı olduğunun da farkındayım (ZipArchive, et al.) ama temel bilgilerle başlayacağımı düşündüm.

Herhangi bir fikrin var mı?

+0

Hata kodu ** 11 **, ** http://www.php.net/manual/en/function.ziparchive-open.php#102849 adresinden "ZipArchive" ile ilgili ** hata açık ** sınıf Sınıfın aynı uzatma işlevine bir sarıcı olacağı için bunu çeviririm. – Dan

+0

Önceden bağlantılı bir yorumda, "c: \ windows \ temp" dosyasında saklanan bir dosyayı açmaya çalışırken, değişen Windows işletim sisteminde döndürülen hatadan bahseder. Denemem sırasında "php: // temp" akışı kullanılır. veri uzunluğu kaplamayı aştığında bir dosya var, orada olmazdı, yine de php: // memory 'ye geçtim, yine de ** bir hatayla sonuçlanır **. – Dan

+0

Teşekkürler @Gordon - * Düzenlendi *; Yazmamak, sadece okumak aslında. – Dan

cevap

2

11 kullanılabilir olmayan açık dosya el sarma akış olup durumuna yaptığı

Not edebilir kılavuzu

ile tarif sabit ZIPARCHIVE::ER_OPEN vardır.


PHP'nin phar uzantısını kullanarak düşünmek edin - istediğini yapar ve iyi test edilir.

+0

Teşekkürler @cweiske - ** phar ** 'nın farkındayım, ancak bu daha çok akademik bir araştırmayla ilgiliydı, aynı anda akışlar ve arşiv desteği hakkında daha fazla bilgi edinildi. Bu bağlamda, akış paketleyicilerinin kullanılabileceğini açıkça belirtmeksizin, bunun mümkün olmadığını rahatlıkla söyleyebilir miyiz? Sanırım öyle görünüyor. PHP'nin herhangi bir şekilde bellekten ZIP arşiv ikili verileriyle çalışmak için çok az (* okuma, no *) desteği olduğunu varsayalım mı? Bir ara dökümü için geçici bir dosyadan yararlanmak pratik olarak iyi konuşur, ancak hala hafızada çalışmayı merak ediyorum. – Dan

+0

Ayrıca, php: // temp' akışını yeniden açarak mevcut içeriği temizlediğini de keşfettim. Zip_open() işlevi akış sarmalayıcıları destekleyip desteklemiyor olsun, bu durum boş bir arabellekte etkili bir şekilde geçtiğim için kesinlikle sorun olur ve varolan bir akış kaynağı tanıtıcısını zip_open() işlevine iletemiyorum. – Dan