興味深い状況があり、回避方法がわかりません。EBS共有からファイルを読み込むためのタイムアウトを設定する
私たちは、売上データを集計し、Google Chartを介してグラフを作成するプロセスを持っています。データベース(またはGoogleの問題)を叩くことを防ぐため、30分ごとにこれを実行します。前のファイルを調べて、30分のしきい値に達したかどうかを判断し、しきい値に達している場合は新しいファイルを作成します。ロードバランサの背後に2台のサーバーがあります。したがって、両方のサーバーは、このファイルを格納するために同じ場所にアクセスする必要があります。私たちは、NFS経由でマウントされたEBS共有を使用しました(私たちの設定全体はAWSにあります)。このプロセスはうまくいきます。
問題は、EBS共有が低速または切断されていることがあります。これは、内部のツール全体で、この1つのファイルを処理するのを待つ(通知をオフにしない限り)波及効果を引き起こします。私はstream_set_timeoutについて話しているいくつかのスレッド(this oneのようなもの)を読んだことがありますが、ファイルをロードする際にそれをどのように使うのかは明確ではありません(正確にはストリームではありません)。
ここスニペットは、私は、このスクリプトのタイムアウトを作成することができますどのようにあなたのPHPファイルが
$file = '/ebs/path/to/image.png';
$newfile=false;
if(!is_file($file)) $newfile=true;
elseif(filemtime($file)+1800 < time()) {
$newfile=true;
unlink($file);
}
if(!$newfile){
$i=imagecreatefrompng($file);
header('Content-Type: image/png');
header('Expires: ' . gmdate('D, d M Y H:i:s', filemtime($file) + $timeout) . ' GMT');
imagepng($i);
imagedestroy($i);
exit;
} else {
// Build and output a new file here
}
をやっていることのアイデアを与えるためには?
根本的な原因は「EBSの速度が遅い、または接続が切断されています」です。究極の解決策はこれを修正することです。 AWSがその課題に従っているかどうかは別の問題です。 –