php 15万件のデータをダウンロードするcsvファイルのソリューション


詳細
今日は16万件のデータをcsvファイルにダウンロードする問題をまとめました.主に消費レポートで、財務帳簿に使用して、excelファイルにダウンロードする必要があります.私たちはダウンロードします.csvファイルは、データ量の大きい業者に出会って、1ヶ月の消費データは15万本を超えて、いつも99%までダウンロードして詰まって、実はバックグラウンドはすでに500あるいは504を間違えました.
 
今日は15万8千件以上のデータのダウンロードが失敗した問題を徹底的に解決しました.もちろん、メモリオーバーフローの問題も発生しましたが、ボトルネックを見つけ、コードを最適化し、メモリオーバーフローの問題を解決しました.
以前のコードは、データベースから取り出した2万件のデータをページごとに取り出さずに、そのまま一気に取り出し、csvファイルにデータをスペルするのに必要なブロック全体のdata、つまり行ごとに書き込むかどうかで、最初の無駄なメモリはarrayにデータを保存することであり、2回目の浪費メモリはarrayにデータをスペルしてcsvファイルに書くので、メモリがオーバーフローします.最適化案はphpメモリを拡大し、コードを最適化することであり、phpのデフォルトのメモリ128 Mは小さすぎて、20 wのデータをダウンロードする業務に比べてメモリが1 Gに拡大する.コード最適化案:データの改成ページを取り、10000個ごとに取り、foreachという1万個のデータを綴りながらcsvファイルに書き、fputcsv($fp、$row);このように最適化すると、8万件のデータをダウンロードしてもメモリがオーバーフローしません.
 
この特殊なactionをダウンロードするメモリを拡大し、
 ini_set('memory_limit', '1G');//         1G
 

 
その後メモリオーバーフローは発生しなくなったが、データ量が11万件以上の場合、ダウンロードは成功せず、ログを調べるとPHP Fatal error:Maximum execution time of 30 seconds exceeded in/xx/xxディレクトリであることが分かったので、解決策はこのダウンロードのactionの前に一言を加えることである.
       set_time_limit(0);//       

その後、ダウンロードを実行すると、phpではエラーが報告されなくなったが、ページ側は504に戻ってタイムアウトした.ページのresponseでヒントを見ることができるのはnginxが間違っていることを報告して、nginxログの中で調べて、やはりFatalの間違いがあります:
2017/10/31 15:25:03 [error] 15639#0: *696311 upstream timed out (110: Connection timed out) .
それから运維の同僚を見つけて、サーバーnginxの配置を修正して、逆エージェントはタイムアウトして、15万8千余りのデータをダウンロードして成功しました.
構成の変更は次のとおりです.
NGINX         ,    :

        server {
    listen *:80;

        location ~ .*\.(php|php5)?$
        {
            fastcgi_pass   127.0.0.1:9001;
            fastcgi_index  index.php;
            fastcgi_read_timeout 200;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }
    }

 
有効になったのは主にそのfastcgiですread_timeout時間.200に変更し、158500件のデータをテストしてダウンロードしても問題ありません.