このトピックについていくつか検索しましたが、価値のあるものは何も見つかりませんでした。
PHP のデフォルト セッション ハンドラを使用しない場合、リクエスト レベルでのセッション ロックはありません。だから、私は自分で重要なセクションを保護する必要があります。
Java では、同期しました。C# にはlockがあります。
PHPでは、それを行う方法は?
このトピックについていくつか検索しましたが、価値のあるものは何も見つかりませんでした。
PHP のデフォルト セッション ハンドラを使用しない場合、リクエスト レベルでのセッション ロックはありません。だから、私は自分で重要なセクションを保護する必要があります。
Java では、同期しました。C# にはlockがあります。
PHPでは、それを行う方法は?
そのためにセマフォを使用します。
PHP スクリプトはマルチスレッド化されていないため、クリティカル セクションは関係ないと思います。複数のインスタンスが並行して実行されるため、競合状態が発生することに同意しますが、クリティカル セクションでは問題は解決しません。
ファイルベースのセッション ハンドラーを使用している場合は、基本的なflock()
. データベースを使用している場合は、エンジン独自の (できれば行レベルの) ロック メカニズムを使用してみてください。memcached を使用している場合は、分散ロック システムの実装を試すことができます。
ロックを広範囲に適用したくないでしょう。可能な限り詳細なものが必要になります (おそらくセッション ID に結び付けられます)。すべてのセッション動作をシリアル化しようとすると、大きなボトルネックが発生します。
データベースの世界 (およびその他の世界) では、多くの場合、必要なのは楽観的な "ロック" だけです。それらには、インクリメントされる単純なカウンターが含まれます。カウントが「オフ」(衝突) の場合、レコードは更新されず、必要に応じて差異を再取得して適用できます。UPDATE table WHERE count = lastcount
リトライと組み合わせたタイプのものです。多くの場合、これでうまくいきます。
もちろん、ファイル ロック、SYSV セマフォ (控えめに)、およびその他のさまざまな方法を使用して、この目標を達成できます。これは競合状態のように聞こえますが、スレッドとは関係ありません。
ほとんどの場合、クリティカル セクションを処理する必要はありません。PHP にはスレッド モデルがない (メモリの共有がない) からです。あなたが利用できるとは思いませんsemephores
。PHP は、PHP 作成者 Rasmus Lerdorf のスライドに見られるように、「シェアナッシング アーキテクチャ」を使用します。これは、スライドでわかるように、
共有データはデータストア レイヤーにプッシュ ダウンされます
apache の上で単純な PHP スクリプトを実行するだけで、クリティカル セクションを処理する必要さえありません。データベースを介してデータを操作する必要があります。ファイルを使用してロックすることもできますが、ファイルの代わりにデータベースを使用します。
これがあなたの質問に少し答えることを願っています。