4

セッションを同期する必要があります。A書き込み/保存session Bまたはanother A待機中の場合。ファイルベースのセッション処理には必須です。

ただしA、セッションをロードしたら (ただし、変更を保存した後) B、同じセッションをロードすることも許可する必要があります。ロードするとファイルが開き、ファイルの内容がメモリに読み込まれて閉じられるためです。

AセッションをロードしAてセッションを保存している間、他のすべてのスクリプトをブロックする理由はありますか? 保存ハンドラのみで同期を行うことはできませんか?

したがって、同じセッションを共有する場合、2 つの PHP スクリプトが同時に動作することはありません。

例えばseslock.php

<?php
header('Content-Type: text/plain');
session_start();
if(isset($_GET['wait'])){
    sleep(30);
    echo "waiting\n";   
}else{
    echo "No Waiting\n";
}
?>
done

訪問seslock.phpはすぐに応答しますが、応答にseslock.php?wait は 30 秒かかります。seslock.php?waitしかし、問題は、最初に 2 番目にのみ要求する場合ですseslock.phpnon-sleepブロックが 30 秒間待機するように要求するイベント。

なぜブロックするのかは私の質問ではありません。なぜブロックするのstart to saveですか?ブロックする代わりにonly save

4

2 に答える 2

6

可能な重複:

PHPでsession_startはどのようにロックしますか?

あるスクリプトがcurlを使用して別のスクリプトを呼び出すと、session_startがタイムアウトを引き起こすのはなぜですか

session_start がハングする

PHPセッションを強制終了するには?

... そして多くの ;)

編集

  1. ブロックする理由は、セッション ファイルが読み取られており、最初のスクリプトが実行されているときに変更される可能性があるためです。したがって、ロックされます。

  2. これに対する救済策は、この投稿で指摘されてsession_write_close()いる可能性があります

  3. Konr Nessによる、phpリクエストのブロックを防ぐ方法

于 2012-06-25T11:17:55.600 に答える
0

デフォルトのPHPセッションハンドラーは、各セッションIDのセッション変更をシリアル化するために作成されています。これには、スクリプト全体で一貫したセッション状態が保証されるという利点があります。

session_write_close()の直後に実行することで、この利点を放棄できますsession_start()。ただし、これによりセッションが読み取り専用になります。

または、ロックせずに独自のセッションハンドラーを作成することもできます。

于 2012-06-25T23:16:48.267 に答える