PHPのfwriteでのエラー
管理画面でfwriteを使ってCSVを作成し、zipに圧縮してダウンロードさせる物があるのだがzipが開けないと言う報告を請けた。
既に運用して1年くらい経っていて、今までそんな兆候すらなかったシステムでのエラーなので不可解に思ったが調査。
まずはLinuxのエラーログ
PHP Warning: fwrite(): iconv stream filter ("utf-8"=>"cp932"): invalid multibyte sequence in /hoge/fuga/mogu/export.php on line 012, referer: https://ore.jp/system/hoge.php
iconv steram filter 上でマルチバイトの文字列がおかしくなっとるぞ。と。
エラーログに指摘されている行数ではfwriteをしている。
他のデータをエクスポートしながらログを追うとエラーログが出力される事はない。
また、このzipファイルになる前のtmpファイルのcsv自体はftpから落とすとexcelで正常に開ける。
zipファイルに圧縮する際に何かしらのエラーが発生して正しく動作していない物と思われる。
ここで考えられる事として、DB上に格納されたデータの文字列(特に2バイト文字)に何かしらの不備があると思われる。
ただ行数が多すぎて何がダメかと言う事自体を特定するのは運用しつつなので現実的ではない。
このファイル作成にあたる宣言部分は
stream_filter_append($file,'convert.iconv.utf-8/cp932');
となっているが
stream_filter_append($file, 'convert.iconv.utf-8/cp932//TRANSLIT');
と、TRANSLIT宣言を加えるとzipファイルの解凍が正常に出来るようになった。
取り急ぎすぐデータがほしい物との事だったので回避策として。
原因自体はデータから探すしかないか。