web-dev-qa-db-ja.com

504 Gateway Timeoutを受け取ったときに、PHPスクリプトの実行は停止しますか?

私は共有サーバー(Siteground)を使用していますが、WordPress PHPスクリプトは30秒以上かかるため、504ゲートウェイタイムアウトを返します。

さらにエラーが発生しない場合、クエリは実行されて完了しますか?

編集:ホスティングチームにこのエラーを受け取った理由を尋ねました。ここでは、Siteground Hostingの専門家が問題を次のように説明しました。

すべてのサーバーでApache + Nginxの両方を使用します。 ApacheはメインWebサービスに使用され、Nginxはリバースプロキシおよび分散キャッシュとして使用されます。キャッシュから応答を提供できない場合(通常、これは動的コンテンツを指します)、Nginxからの要求はApacheに対して行われます。これは、Apacheがリクエストを処理しているときに、リクエストをWebサイトに転送し、PHPロジックに従ってMySQLクエリを実行するか、他のデータを取得します。このプロセスに時間がかかりすぎて、ApacheがNginxにタイムリーに応答を返さない場合、このエラーが表示されます。要するに、アプリケーションは許可された時間内にプロセスを完了したため、Apacheはリクエストをサーバーに送信できません。これは、開始されたプロセスがおそらく完全に完了せず、一部のデータ/アクションが保存/実行された可能性があることも意味します。

専門家によると、"initiated process most probably not completed fully"

私のシナリオの詳細:私のスクリプトは、wordpressウェブサイトにwp_insert_postメソッドを使用して、バリエーションのあるwoocommerce製品を追加します。製品が追加されると、新しく追加された製品の画像が表示されます。

1つの製品(40のバリエーション)を追加すると、製品イメージが完成して表示されます。 6つの製品(240のバリエーション)を追加すると、ブラウザーに直接エラーが表示されます。

この問題をさらにテストするために、コードを修正し、ajaxを使用してコードを書き直し、システムのようなプロセスバーを追加しました。 (バリエーションごとに数値を増やします)。

1つの製品(40種類のバリエーション)に対してコードを実行すると、プロセス番号が40に増加し、製品イメージが表示されます。

6つの製品に対してコードを実行すると、プロセス番号は240に増えますが、何も表示されず、チェックすると504エラーが返されます。 (jQuery.Ajax関数エラーセクション)

そのため、クエリがタイムアウトしても実行されると思うようになりますが、それでも良いドキュメントがないため、504ゲートウェイタイムアウトエラーの詳細を確認することはできません。

8
HOY

スクリプトは、PHPタイムアウト自体に達するまで実行を停止しません。

504エラーはゲートウェイ/プロキシ自体で生成されますが、PHPプロセスからではありません。

これは、Apache-mod-phpでApacheを使用している場合、プロキシがないためにこのエラーを受け取ることがないためです。

説明を拡張して、次のように考えてください。

PHPプロセスがあります。 PHPプロセスは、PHP-FPM、PHP-CGI、またはApache-MOD-PHPのいずれかです。このプロセスでは、タイムアウトが発生します(php.iniまたはini_setで構成されます)。

PHPプロキシは許可された時間内に応答を返します(別名:set_time_limit(600)がある場合、PHPプロセスは最大10分間実行できます)。

この文に関係なく、これらの応答を待つ別のプロセスを持つことができます:それは、Apache(cgiまたはfpmによってphpに接続するように構成されている)、nginx、lighthttpdなどの場合です。 Apache-mod-phpで設定されたApacheの場合はそうではありません。この2番目のプロセスには、vhost /一般的なサーバーアプリ構成で構成された新しいタイムアウト(proxy_timeout)があります。これは、プログラムがPHP処理エンジンからの応答を待つ時間です。

最後の文は、各プロキシ/ゲートウェイで繰り返すことができます。

このシナリオを考えてください:

haproxy(タイムアウト1)-> Nginx(フロントエンド/キャッシュ)(タイムアウト2)-> Apache(タイムアウト3)-> PHP-FPM(PHPタイムアウト/ set_time_limit)。

そして非常に単純なシナリオ:

Apache(Apache-mod-phpを使用)(PHPタイムアウト/ set_time_limit)。

タイムアウトの外観(PHPタイムアウト自体を除く)は、504 HTTPゲートウェイタイムアウトエラーの原因と考えられます。

2
Sakura Kinomoto

私の理解では、スクリプトは実行を続けますが、クライアントへのデータのレポートは停止します。 (それを説明するための知識があるわけではありません。)ここに役立つ記事があります:

WordPressの504ゲートウェイタイムアウトエラーを修正する方法

1
elbrant