2

このトピックについていくつか検索しましたが、価値のあるものは何も見つかりませんでした。

PHP のデフォルト セッション ハンドラを使用しない場合、リクエスト レベルでのセッション ロックはありません。だから、私は自分で重要なセクションを保護する必要があります。

Java では、同期しました。C# にはlockがあります。

PHPでは、それを行う方法は?

4

3 に答える 3

4

そのためにセマフォを使用します。

于 2010-04-05T00:57:50.130 に答える
3

PHP スクリプトはマルチスレッド化されていないため、クリティカル セクションは関係ないと思います。複数のインスタンスが並行して実行されるため、競合状態が発生することに同意しますが、クリティカル セクションでは問題は解決しません。

ファイルベースのセッション ハンドラーを使用している場合は、基本的なflock(). データベースを使用している場合は、エンジン独自の (できれば行レベルの) ロック メカニズムを使用してみてください。memcached を使用している場合は、分散ロック システムの実装を試すことができます。

ロックを広範囲に適用したくないでしょう。可能な限り詳細なものが必要になります (おそらくセッション ID に結び付けられます)。すべてのセッション動作をシリアル化しようとすると、大きなボトルネックが発生します。

データベースの世界 (およびその他の世界) では、多くの場合、必要なのは楽観的な "ロック" だけです。それらには、インクリメントされる単純なカウンターが含まれます。カウントが「オフ」(衝突) の場合、レコードは更新されず、必要に応じて差異を再取得して適用できます。UPDATE table WHERE count = lastcountリトライと組み合わせたタイプのものです。多くの場合、これでうまくいきます。

もちろん、ファイル ロック、SYSV セマフォ (控えめに)、およびその他のさまざまな方法を使用して、この目標を達成できます。これは競合状態のように聞こえますが、スレッドとは関係ありません。

于 2010-04-05T01:15:36.380 に答える
0

ほとんどの場合、クリティカル セクションを処理する必要はありません。PHP にはスレッド モデルがない (メモリの共有がない) からです。あなたが利用できるとは思いませんsemephores。PHP は、PHP 作成者 Rasmus Lerdorf のスライドに見られるように、「シェアナッシング アーキテクチャ」を使用します。これは、スライドでわかるように、

共有データはデータストア レイヤーにプッシュ ダウンされます

apache の上で単純な PHP スクリプトを実行するだけで、クリティカル セクションを処理する必要さえありません。データベースを介してデータを操作する必要があります。ファイルを使用してロックすることもできますが、ファイルの代わりにデータベースを使用します。

これがあなたの質問に少し答えることを願っています。

于 2010-04-05T01:16:21.690 に答える