2011-08-02 15 views
6

これが可能かどうかは不明ですが、今は学問的な闘争になっています。 PHPファイル内のバイナリデータを埋め込むこと__halt_compiler()トリックを使用しPHP zip_open()とphp:// tempは開くことができません

、私は正常にfseek()__COMPILER_HALT_OFFSET__

があまりにもハードまさにこの例では、マニュアルに記載されていて見ていない)だろう自己開放スクリプトを作成しました

とにかく、私は私がしようとした何__halt_compiler()

に私の呼び出しの後である(「Hello World」の言う単一のファイルを含む単一のフォルダが)バイナリZIPデータの小さな塊を保存しましたデータを直接にコピーしてください(I rewind()passthru()一時的なストリームハンドルが、それはデータをダンプする場合)10流れ、そして成功して行っている

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

私の問題はzip_open()

でにオープンしましphp://temp しようとしていますそのような他のPOSSにもかかわらず、私が見ることができるものから、
$zip = zip_open('php://temp'); 

zip_open()でストリームサポートが不足しているとして)、ここでの問題は、ハンドル間のphp://memoryphp://tempストリームのデータの固有の非永続性です。これを回避することができれば、おそらく実際には可能です。それは戻って、私は(一見、他のほとんどのエラーコードのような)になし 文書を発見したエラーコード11

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

を蹴り続ける

@cweiskeが指摘したように、エラーコード11 = ZipArchive::ER_OPENファイルを開けません

この結果、php://tempストリームを使用しようとする私の試みやその他の問題がありますか?私はOOPアプローチ(ZipArchiveなど、)が存在することも知っていますが、私は基本から始めると思いました。

アイデア?

+0

エラーコード** 11 **は**エラーオープンです** http://www.php.net/manual/en/function.ziparchive-open.php#102849によると、ZipArchive 'クラス。私は、クラスが同じ拡張機能のラッパーになるため、これが翻訳されていると仮定します。 – Dan

+0

以前にリンクされたコメントでは、さまざまなWindows OS上で、 'c:\ windows \ temp'に格納されたファイルを解凍しようとしたときに返されたエラーについても言及しています。データ長が上限を超えたファイル、そこには存在しないと思いますが、私は 'php:// memory'に切り替えてしまいましたが、まだ**エラーが発生しています**。 – Dan

+0

ありがとう@Gordon - *編集*;いいえ書いて、実際には読書だけ。 – Dan

答えて

2

11マニュアルが

開いているファイル

マニュアルはストリームラッパーを使用することができることが ない状態にないこと

注意することはできませんと説明しており、一定のZIPARCHIVE::ER_OPENです。


PHPののphar拡張子を使用して考えてください - それはあなたが何をしたいし、かつ十分にテストされています。

+0

ありがとう@cweiske - 私は** phar **を認識していますが、これは学問的な調査のほうが多く、ストリームとアーカイブのサポートについてもっと学びました。ストリームのラッパーがこのコンテキストで使用される可能性があるという明示的な言及がない限り、これは不可能であると安全に想定できますか?私はそれが確かにそれのように思える。さらに私は、PHPがメモリからのZIPアーカイブバイナリデータの操作を少しでもサポートしていると仮定しますか?仲介ダンプのために一時ファイルを使用することは事実上はうまくいくかもしれませんが、私はまだメモリ内で厳密に作業することに興味があります。 – Dan

+0

私は、 'php:// temp'ストリームを再オープンすることで、既存の内容をフラッシュすることも発見しました。 'zip_open()'がストリームラッパーをサポートしているかどうかにかかわらず、私は空のバッファを効果的に渡しているので、これは確かに問題になるでしょうし、 'zip_open()' – Dan

関連する問題