私はこの質問に対する答えを見つけることに完全に失敗しました。うまくいけば、ここの誰かが助けてくれるでしょう。
ユーザーが画像をヒットしたときに画像を自動的にインポートして処理する PHP スクリプト (具体的には WordPress テンプレート) があります。問題は、特に複数のユーザーが同時にテンプレートにアクセスして画像処理を開始する場合、画像処理が大量のメモリを消費することです。このため、サーバーが何度もクラッシュしました。
これに対する私の解決策は、画像処理機能が既に実行されている場合は実行しないことでした。関数の実行を開始する前に、image_import_running という名前のデータベース エントリが false に設定されているかどうかを確認します。そうであれば、関数は実行されました。関数が最初に行ったことは、image_import_running を true に設定することでした。その後、すべてが終了したら、false に戻します。
理論的にはうまくいきました。それ以来、サイトはクラッシュしていません。しかし、これには次の 2 つの大きな問題があります。
読み込み中にユーザーがページを閉じた場合、スクリプトは画像の処理を終了しないため、image_import_running を false に戻すことはありません。テンプレートは、手動で false に設定されるまで、画像を再度処理することはありません。
画像の処理中にスクリプトがタイムアウトした場合 (キューに多くの画像がある場合は可能性が高い)、本質的には 1 と同じ問題があります。間違い。
No. 1 (私が気付いた 2 つの問題のうち最初の 1 つ) を処理するignore_user_abort(true)
ために、スクリプトに追加しました。うまくいきましたか?No. 2 はまだ問題なのでわかりません。それが私が困惑しているところです。
スクリプトが実行されているかどうかをサーバーに問い合わせることができれば、次のようなことができます。
if($import_running && $script_not_running) {
$import_running = false;
}
しかし、どうすればその$script_not_running
変数を設定できますか? 私を殴る。
他に素晴らしい解決策がある場合に備えて、このストーリー全体を共有しました.