zipファイルを作成/ダウンロードする際に気をつけることバックアップのために、phpでzipファイルを作成してダウンロードさせるプログラムを書いたのですが、ありがちな引っかかるポイントがあったのでメモしておきます。書いたコード書いたコードは以下です。zipにする処理はlinuxのzipコマンドを使いました。filename="'.basename($zippath).'"');readfile($zippath);どこが問題だったか結論から言うと、ファイルをクリアする際に再帰的に削除していなかったことと、ディレクトリ作成時に存在確認をしていないのが問題でした。エラーの内容このコード、間違いはほとんどないです。厄介なポイントがいくつかあります。zipにするのがファイルのみだったら問題なく動作する。zipにしたい内容にディレクトリが含まれるとき、エラーが発生する(上記ではターゲットディレクトリの中に日付のディレクトリを作成)最初の一回は問題なく動作する。するが、zipファイルはダウンロードできる。ダウンロードしたzipファイルを解凍すると、ほとんどのファイルは見られるが、一部のファイルが見られないような状態に陥る。(必ずそうなるかはわかりません)気づいたことターゲットディレクトリの中にzipファイルを作成していたのですが、そのzipファイルをサーバから直接ダウンロードすると、エラー無く解凍できることがわかりました。php経由でダウンロードしたzipファイルと、サーバから直接ダウンロードしたzipファイルでは、php経由のほうが1KBほど大きいことに気づきました。ファイルをクリアする際に再帰的に削除していなかったため、ディレクトリ作成時にphpが「既にディレクトリが存在する」というエラーを吐いていました。そのエラー文字列がheader出力前に表示されていたことで、エラー文字列もまとめてzipの一部と解釈され、zipファイルにゴミが紛れ込んでいた状態に陥ってしまったというわけです。mkdir($dateDir,0777);}まとめぶっちゃけ、めっちゃよくあることなんですが、割とどうでもいいことでもブログに書いていこうかなという気持ちになったので、書いてみました。誰かの参考になれば幸いです。