2

サーバーがリクエストを処理する方法 (-> PHP スクリプトへの同時リクエスト) のため、スクリプトがファイル名をチェックしてファイルを保存するとどうなるかについて質問があります。

例: ユーザー A が「save.php」を要求します。しばらくして、ユーザー B が「save.php」をリクエストします。ユーザー A のスクリプトは、スクリプトがファイルが存在するかどうかをチェックするポイントにあります。ファイルが存在せず、ファイルが書き込まれる前に、ユーザー B のスクリプトはファイルの存在を確認する時点にあります。そのため、ファイルが存在しないとも表示されます。ここで、ユーザー A のスクリプトがファイルを書き込みます。また、ユーザー B のスクリプトは、ファイル名が同じ場合、ファイルを上書きします。(ファイル名はランダムですが、これは発生する可能性があります)。

どうすればそのようなことを避けることができますか? PHPコマンドのテーブルロックとトランザクションのようなものはありますか? サーバーからより多くのリソースを取得するため、ユーザー B のスクリプトがユーザー A のスクリプトよりも速く実行される可能性はありますか?

よろしくお願いします

4

2 に答える 2

2

ご覧ください:

http://www.php.net/manual/en/function.fopen.php

次のようにファイルを作成するときは、排他ロックを使用する必要があります。

$handle = fopen("/home/somewhere/yourfile.txt", "x");

このようにすると、ファイルへの二次アクセス試行 (ユーザー B、C) は false を返し、ファイルが作成され、ユーザー A によって排他的にロックされるため、警告が生成されます。

ファイルが作成されるとすぐに file_exists は true になりますが、排他的にロックされた状態で作成されるため、他のユーザーは fopen できません。

ユーザー A が自分の仕事を終えると、その後の呼び出しでファイルにアクセスできるようになります

モード x および x+ の手動入力は次のとおりです。

'バツ'

書き込み専用に作成して開きます。ファイルポインタをファイルの先頭に置きます。ファイルが既に存在する場合、fopen() 呼び出しは FALSE を返し、レベル E_WARNING のエラーを生成して失敗します。ファイルが存在しない場合は、作成してみてください。これは、基礎となる open(2) システムコールに O_EXCL|O_CREAT フラグを指定することと同じです。

「×+」

読み書き用に作成して開きます。それ以外の場合は、'x' と同じ動作になります。

于 2013-04-11T06:42:52.053 に答える
2

PHP インストールでサポートされている場合は、セマフォを使用してください: http://be2.php.net/manual/en/ref.sem.php

または、flock() 関数を確認することもできます: http://be2.php.net/manual/en/function.flock.php

于 2013-04-11T07:09:01.317 に答える