13

私はPHPで長いスクリプトを作成しました。

ignore_user_abort(true);
set_time_limit(0);

ページを閉じても、バックグラウンドで完全に実行されます。私の問題は、このスクリプトがバックグラウンドで実行を終了するまで、他のPHPファイルを開くことができないことです。どうすればこの問題を解決できますか?

4

2 に答える 2

29

PHPスクリプトがセッションを使用する場合、PHPはスクリプトが完了するまでセッションファイルをロックします。ロックされたセッションを使用しようとするページ要求は、セッションファイルが解放されるまでブロックされます。PHPはこれを行うため、セッションは一貫した状態に保たれます。PHPバグ#31464からの引用

[2005-01-10 08:13UTC]phpドットネットでのデリック

これは実際にはまったくバグではありません。同時更新によってファイルが破損しないように、セッション拡張機能はセッションファイルをロックする必要があります。これは、同じセッションファイルを使用するすべてのスクリプトをシリアル化する必要があることを意味します。パフォーマンスを向上させるため に、セッション変数の読み取り/設定が完了したらすぐにhttp://php.net/session_write_closeを使用できます。これにより、ファイルのロックが解除されます。

上記およびここでも説明されている最も簡単な回避策は次のとおりです。

  • 電話session_start()
  • セッション変数の読み取り/書き込み
  • 電話session_write_close()
  • 長い処理を行う
于 2012-11-30T19:17:32.290 に答える
10

コメントで述べたように、セッションが問題です。これは、セッションファイルがロックされているためです。

実行時間の長いスクリプトで使用してセッションファイルのロックを解除しますが、後でその特定のスクリプトで変数をsession_write_close()使用することはできないことに注意してください。$_SESSION

于 2012-11-30T19:06:08.723 に答える