php関連メモ

自分用メモ。
社内システムのチューニング中、大量のデータを送信する場合に90MB〜170MBのあたりで上手く送れなくなる障害が発生。
旧コードは以下のような感じ。

$LOC_FILE_DATA = file_get_contents(ファイル名);
print $LOC_FILE_DATA;

apachephpのバージョンを変えたり、バッファを増やしてみたりしたけどうまくいかなかった。
 
データを小分けで送出するロジックに変更。
file_get_contentsを使用する方法ではうまくいかなかった(あまりに巨大なファイルだとデータを上手く扱えなかったり、Firefoxでうまく受信できなかったり、等のトラブルが発生した)ので、さらに手堅く、ファイルを小分けのバイナリデータで送出する方法に変更。

$OneShotSize = 1024 * 1024 * 1;
$fl = fopen(ファイル名, "rb");
while (!feof($fl)) {
  print (fread($fl, $OneShotSize));
}
fclose($fl);

$OneShotSizeを多めに取ると転送効率が上がるハズだが、上記の1MBの設定でもそこそこ10MB/sec程度のスピードは出ていた。