考えられる因果関係
- サーバーはXHRリクエストがキャンセルされたことを認識しないため、対応するPHPプロセスは実行を継続します
- これらのPHPプロセスはセッションを使用し、終了するまでこのセッションへの同時アクセスを防ぎます
考えられる解決策
上記の2つのポイントのいずれかに対処すると、チェーンが切断され、問題が解決する可能性があります。
- (a)
ignore_user_abort
FALSE
です デフォルトですが、非標準の設定を使用している可能性があります。この設定をFALSE
に戻します あなたの中でphp.ini
または、ignore_user_abort(false)
に電話してください これらの割り込み可能な要求を処理するスクリプトで。
欠点:スクリプトは終了するだけです。進行中の作業はすべて破棄され、システムがダーティな状態になる可能性があります。
- (b)デフォルトでは、PHPは、クライアントに情報を送信しようとするまで、ユーザーが接続を中止したことを検出しません。
echo
を実行します 長時間実行されるスクリプトの過程で定期的に何か。
欠点:このダミーデータは、スクリプトの通常の出力を破損する可能性があります。また、ここでも、スクリプトによってシステムがダーティな状態になる可能性があります。
- PHPセッションはファイルとしてサーバーに保存されます。
session_start()
について 、スクリプトはセッションファイルを書き込みモードで開き、そのファイルの排他ロックを効果的に取得します。同じセッションを使用する後続のリクエストは、ロックが解除されるまで保留されます。これは、明示的にセッションを閉じない限り、スクリプトが終了したときに発生します。session_write_close()
を呼び出します またはsession_abort()
できるだけ早く。
欠点:閉じられると、セッションを書き込むことができなくなります(セッションを再開しない限り> 、しかしこれはややエレガントでないハックです)。また、スクリプトは実行を続け、リソースを浪費する可能性があります。
私は間違いなく最後のオプションをお勧めします。