PHPスクリプトは、504ゲートウェイタイムアウトを受け取ったときに実行を停止しますか?


8

共有サーバー(サイトグラウンド)を使用していて、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"

私のシナリオの詳細:私のスクリプトはwp_insert_post、ワードプレスのWebサイトに、方法を使用したバリエーションを持つwoocommerce製品を追加します。製品を追加すると、新しく追加された製品の画像が表示されます。

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

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

1つの製品(40のバリエーション)のコードを実行した後、プロセス番号が40に増え、製品の画像が表示されます。

6つの製品のコードを実行すると、プロセス番号が240に増えますが、何も表示されず、チェックすると504エラーが表示されます。(jQuery.Ajax機能エラー部)

したがって、これはクエリがタイムアウトしても実行されると思いますが、確信が持てず、これに関する適切なドキュメントがないため、504ゲートウェイタイムアウトエラーの詳細を探しています。


1
ゲートウェイタイムアウトの原因によって異なります。これは興味深い質問です。
スティーブンオスターミラー

@StephenOstermillerがあなたのコメントに基づいていくつかの詳細を追加しました。
HOY 2018

"6製品(240バリエーション)"がすべてWebサイトに追加された場合に、スクリプトが完了したかどうかを知っていると思いますか?それとも判断するのは難しいですか?スクリプトにいくつかのログ機能を追加しますか?
MrWhite 2018

回答:


3

スクリプトは、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番目のプロセスには、新しいタイムアウト(proxy_timeout)があり、vhost /一般的なサーバーアプリの構成で構成されます。これは、プログラムがPHP処理エンジンからの応答を待つ時間です。

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

このシナリオについて考えてみましょう:

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

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

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

各タイムアウトの外観(PHPタイムアウト自体を除く)は、504 HTTPゲートウェイタイムアウトエラーの原因である可能性があります。


「Apache-mod-phpを備えたApacheがある場合、このエラーは決して発生しません」-この最後の文を説明できますか?
MrWhite 2018

mod-phpでApacheサーバーを使用する場合、実行はApache自体によって行われます。このため、プロセスにゲートウェイがないため、504タイムアウトを取得できません。php-cgiまたはphp-fpmを使用する場合、Apache / nginx /他のWebサーバーは、実際の処理エンジンへのプロキシまたはゲートウェイとして機能します。次に、このゲートウェイが構成された時間内に応答を受信しなかった場合、504エラーが表示されます。
木之本桜

しかし、Apache mod-phpの前にNginxリバースプロキシを配置することはできませんか?
MrWhite 2018

明らかに、それは問題そのものではありません。この場合、504はnginxで指定できますが、Apacheでは指定できません。この場合の問題は、504エラーコードがプロキシによって生成された場合、プロキシ呼び出しによってトリガーされた実行が停止されないのは誰かということです。ゲートウェイまたはプロキシの場合、少なくとも2つのタイマーが機能します。プロキシ通信のタイムアウト(nginxなど)とphpプロセスのタイムアウト。
木之本桜

わかります。ただし、その場合、最後の文は不完全であるように見えます。フロントエンドプロキシの有無にかかわらず、Apache-mod-phpを使用するだけでこのエラーが回避されることを意味します。「Apache-mod-phpを備えたApache のみがあり、フロントエンドプロキシ(この場合はNginx)がない場合、このエラーは発生しません」と私は思います。
MrWhite 2018

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.