PHPでオンザフライでアーカイブを生成し、すぐに(保存せずに)ユーザーに送信しようとしています。とにかく送信しているデータは永続的ではないため、ディスク上にファイルを作成する必要はないと考えましたが、Web を検索しても方法がわかりませんでした。ファイル形式も気にしません。
したがって、質問は次のとおりです。
途中で一時ファイルを作成せずに、phpスクリプト内でメモリ内のファイルアーカイブを作成して操作することは可能ですか?
私は同じ問題を抱えていましたが、最終的にややあいまいな解決策を見つけ、ここで共有することにしました.
「libraries」ディレクトリに付属し、そこにある素晴らしいzip.lib.php
/unzip.lib.php
スクリプトに出くわしました。phpmyadmin
使用zip.lib.php
することは私にとって魅力的でした:
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();
このスクリプトを使用すると、ファイルを実際のファイルとして保持したり、zip 自体をファイルとして保存したりする必要なく、zip をダウンロードできます。
この機能がより一般的な PHP ライブラリの一部ではないことは残念です。
zip.lib.php
phpmyadmin ソースから
のファイルへのリンクは次のとおりです。https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php
更新: zip.lib.php の先頭から次のチェックを必ず削除してください。そうしないと、スクリプトが終了するだけです。
if (! defined('PHPMYADMIN')) {
exit;
}
更新: このコードは CodeIgniter プロジェクトでも利用できます。 https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php
アーカイブを生成するために何を使用していますか? ストリーム php://temp または php://memory を使用して、アーカイブを読み書きできる場合があります。
閉じるとき以外は php://temp が機能するというコメントについては、開いたままにして出力をフラッシュしてから、巻き戻して0に戻して読んでください。
その他の例については、こちらをご覧ください: http://us.php.net/manual/en/function.tmpfile.php
また、出力のバッファリングとキャプチャについても調べてください: http://us.php.net/manual/en/function.ob-start.php
使用する必要がありますZipArchive::addFromString
-使用する場合addFile()
、ファイルを閉じるまで実際には追加されません。(恐ろしいバグ IMHO、ファイルを zip に移動しようとしていて、zip を閉じる前にそれらを削除した場合はどうなりますか...)メソッドはそれをアーカイブにすぐに追加します
。addFromString()
ここに本当にパフォーマンス上の問題がありますか、それともあなたの正義感を害するだけですか? 多くのプロセスは一時ファイルを書き込んで削除しますが、キャッシュのためにディスクにヒットしないことがよくあります。
一時ファイルは閉じると自動的に削除されます。それが自然です。
メモリ内に zip ファイルを作成してそれを提供する方法は 2 つしかないと思いますが、おそらくどちらも、価値があるよりも面倒です。