
Apache + PHP-FPM をセットアップしようとしていますが、長時間実行されるスクリプトが実行され、最終的にタイムアウトになり、Apache と FPM 間のリンクが切断され、最終的にサイト全体がダウンしてしまいました...
--idle-timeout に達した場合にサイト全体がダウンするのを防ぐ方法はありますか?
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 18000 -pass-header Authorization
答え1
php-fpmへのApacheリクエストタイムアウトに達すると中止されますユーザーにとっても同様です。エンド クライアントに応答を取得させたい場合は、次の 3 つの可能性が考えられます。
- タイムアウト値を増やします(PHPアプリケーションがそれよりも遅いため)
- そのリクエストに対してPHPアプリケーションを高速化してみてください
- PHPアプリケーションに所要時間を計算し、タイムアウト値よりも長くかかっている場合はエラーメッセージで応答させます。
私の意見では、ソリューション 2 が開発者にとって通常の選択肢となるでしょう。
答え2
長時間実行されるスクリプトは、ブラウザ/Apache から実行しないでください。FPM ではなく PHP CLI を使用してバックグラウンドで実行する必要があります。CLI スクリプトはタイムアウトせず、Apache の動作を妨げません。
cronjobs を使用してスクリプトを定期的に実行するようにスケジュールするか、一時ファイルを書き込む (たとえば、run_script
Web サイトのディレクトリに というファイルを置き、スクリプトの最後に削除する) か、データベースまたはその他のバックエンドにフラグを設定するなどの操作を行って、ブラウザからスクリプトをトリガーすることができます。
2 番目の方法を選択する場合でも、このファイル/データベース エントリの存在を確認し、見つかったときにスクリプトを実行する cronjob (1 分ごとに実行可能) が必要です (1 分ごとにではなく、常にこれを監視するリスナーを作成することもできますが、これはかなり集中的であり、ほとんどのユース ケースではおそらく過剰です)。
一度起動すると、ユーザーに返されるのは「しばらくお待ちください。リクエストを処理中です。数分後にもう一度ご確認ください。」といった通知だけです。こうすることで、リクエストの実行を継続するためにブラウザを開いたままにする必要がなくなり、その間に他の作業を行うことができます。