csvファイルのzip圧縮について。

DBから抽出した値をcsvファイルに書き出し、zip圧縮を行う必要があります。
また、csvファイルはn件ごとに[test01.csv、test02.csv・・・]とファイルを分割する必要があります。
しかし、csvファイルに書き出す情報量が膨大な為、[csv出力→zip圧縮]と言う処理を行ってしまうと、
一時的ではありますが大きくハードディスク容量を消費してしまうことになります。
その為、一時的にcsvファイルを出力しzip圧縮するのではなく、zip圧縮されたファイルに直接csvファイルを出力する方法を教えていただきたいと考えています。
また、環境はPHP4.3系+MySQL4.1系ですが、今後PHP5へのバージョンアップも予定されている為、PHP4.3・5両方の環境で動作する必要があります。
現時点で見つけたキーワードとして、「圧縮ストリーム」と言うものを見つけましたが、いまいち理解ができておりません。
「$fp = fopen('zip://./foo.zip#bar.txt', 'r'); 」
と言うサンプルプログラムを見つけましたが、動作しませんでした。
イメージとしてはこのような形になります。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/10/08 15:25:03

回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

OS が Linux などの unix 系だとしたら、zip コマンドがあるはずです。
それに、パイプを使って流し込んであげれば良いのではないかしら。

<?php
    $zip_file = ...;                    // 圧縮ファイル名
    $cmd = "zip - - > " . $zip_file;    // 実行するコマンド : "zip - - > hogehoge.zip" という感じ
    $pp = popen($cmd, 'w');             // パイプを開いて
    fwrite($pp, $csv_data);             // CSV のデータを書き込む。ループして書きこんでも、大丈夫。
    pclose($pp);                        // 最後にパイプを閉じる
?>


外部コマンドを使うときには、こんな注意点もあるみたいです。
http://jp.php.net/manual/ja/function.popen.php

注意: セーフモード が有効な場合、 safe_mode_exec_dirの中にある実行プログラムのみ実行可能です。実際的な理由により、現在、実行プログラムへのパスに ..を含めることはできません。

  • id:standard_one
    >一時的ではありますが大きくハードディスク容量を消費してしまうことになります

    難癖付けられている感バリバリ
    ちゃんとクライアントを説得するほうが早いんじゃない?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません