私は共有サーバー(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ゲートウェイタイムアウトエラーの詳細を確認することはできません。
スクリプトは、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ゲートウェイタイムアウトエラーの原因と考えられます。
私の理解では、スクリプトは実行を続けますが、クライアントへのデータのレポートは停止します。 (それを説明するための知識があるわけではありません。)ここに役立つ記事があります: