大きな画像からサムネイルを作成するWebサイトでphpスクリプトを実行しています。このスクリプトはimagickを使用して、画像ごとに10個のサムネイルを生成します。
サムネイルがまだ存在しない場合、最初のページの読み込み時に実行され、最初のページの読み込み時に何百ものサムネイルの生成を要求される可能性があります。これには時間がかかります(10個のサムネイルのバッチあたり約2.5秒)。したがって、サーバーは504ゲートウェイタイムアウトエラーを返します。
このエラーの意味:
サーバーは、ゲートウェイまたはプロキシとして機能しているときに、URIで指定された上流サーバーからタイムリーな応答を受信しませんでした... [ source ]
PHPスクリプトが60秒以上実行される可能性があるため、これは理解できます。
私の質問は:これは、スクリプトがサーバーをクラッシュさせ、実行中に停止したということですか?
またはこれは、ブラウザーがサーバーの応答を待つのを待ちわびているということですか?
私の主な懸念は、サムネイルの生成中にスクリプトが破損し、破損したファイルが生成される可能性があることです。
通常、ゲートウェイタイムアウトエラーは、サーバーがクラッシュしたことを意味しません。ブラウザもこれらのエラーを生成しません。これは、中間サーバーがプライマリサーバーを待つのにうんざりしたことを意味します。
これらのエラーが発生した場合、通常、プロキシサーバーが関係していることを意味します。あるポートから別のポートへのリバースプロキシがある場合があります。 CDNまたはロードバランサーを使用している可能性があります。
破損したファイルについて心配する必要があります。通常、最初のロード時にファイルを生成することは適切な計画ではありません。 Webサーバーがプロセスを強制終了する前に、時間制限を要求するほとんどの要求。たとえば、PHPを使用してこのプロセスを開始する場合、十分な長さを設定する必要があります http://php.net/manual/en/function.set-time-limit.php
また、競合状態も考慮する必要があります。 1つ目のリクエストがまだ処理されている間に2つ目のリクエストが入るとどうなりますか?画像も生成しますか?同じ場所にイメージを書き込もうとする2つのプロセスにより、破損が発生する可能性があります。
数秒以上かかるジョブは、異なる方法で処理する必要があります。いくつかのオプションがあります。それらを非同期で実行し、Webリクエストにステータスをチェックさせることができます。画像をアップロードした後、またはWebサイトの展開の一部として、画像のサイズを変更できます。画像のサイズを変更する必要があるかどうかを定期的に確認するcronジョブを使用できます。