phpファイルロック(転送)
bool flock ( int handle, int Operation [, int &wouldblock] );
flock() 操作のハンドルは、開いているファイル ポインターである必要があります。操作は次の値のいずれかになります:
2 つのファイルを作成
(1) a.php
$file = "temp.txt"; $fp = fopen($file , 'w'); if(flock($fp , LOCK_EX)){ fwrite($fp , "abc\n"); sleep(10); fwrite($fp , "123\n"); flock($fp , LOCK_UN); } fclose($fp);
(2) b.php
$file = "temp.txt"; $fp = fopen($file , 'r'); echo fread($fp , 100); fclose($fp);
a.php を実行した後、すぐに b.php を実行すると、出力が表示されます:
abc
a.php が実行されるのを待って、b.php を実行すると、出力が表示されます:
abc
123
明らかに、 a. php がファイルを書き込むとき、データが大きすぎて時間がかかります。このとき、b.php は不完全なデータを読み取ります
b.php を次のように変更します。
$file = "temp.txt"; $fp = fopen($file , 'r'); if(flock($fp , LOCK_EX)){ echo fread($fp , 100); flock($fp , LOCK_UN); } else{ echo "Lock file failed...\n"; } fclose($fp);
a.php を実行した後、 b.php は、a.php が完了するまで (つまり、10 秒後) 表示されるまで待機することがわかります:
abc
123
読み取りデータは完了しましたが、時間が長すぎます。 、書き込みロックが解除されるまで待たなければなりません。
b.php を次のように変更します:
$file = "temp.txt"; $fp = fopen($file , 'r'); if(flock($fp , LOCK_SH | LOCK_NB)){ echo fread($fp , 100); flock($fp , LOCK_UN); } else{ echo "Lock file failed...\n"; } fclose($fp);
a.php を実行した後、すぐに b.php を実行すると、出力が表示されます:
ロック ファイルが失敗しました...
代わりにロック ファイルの失敗ステータスを返すことができることを証明します。上記と同じリクエストの場合は、しばらく待ちます。
結論:
ファイルをキャッシュするときは、関連するロックを選択することをお勧めします。そうしないと、読み取られたデータが不完全になったり、データが繰り返し書き込まれたりする可能性があります。
file_get_contents はデフォルトでどのようなロックを使用するのかわかりませんが、ロックしない場合でも得られる出力は同じであり、不完全なデータです。
ファイルのキャッシュを実行したいので、書き込みロックがあるかどうかを知る必要があるだけで、ある場合はデータベースをチェックするだけです。
テスト環境: Linux (Ubuntu 6)、PHP 5.1.2、Apache 2
リダイレクト:
ファイル ロックには、共有ロックと排他ロック、つまり読み取りロック (LOCK_SH) と書き込みロック ( LOCK_EX)
ファイル ロックは通常次のように使用されます:
$fp = fopen("filename", "a"); flock($fp, LOCK_SH) または die("lock error") $str = fread($fp, 1024); flock($fp, LOCK_UN);
これは、ファイルが更新される前に fwrite を待ってから fclose するのではなく、fwrite の直後に更新されることに注意してください。 fwrite の後、fclose の前にチェックするファイル
しかし、いつ lock_ex を使用し、いつ lock_sh を使用するのでしょうか?
読み取り時:
ダーティなデータを表示したくない場合は、lock_sh 共有ロックを使用するのが最善です。次の 3 つの状況が考えられます:
1. 読み取り時に共有ロックが追加されていない場合、他のプログラムが書き込みを行おうとすると (書き込みがロックされているかどうかに関係なく)、書き込みはすぐに成功します。ちょうど半分を読み取って別のプログラムで書き込んだ場合、読み取った後半は前半と一致しない可能性があります(前半は修正前、後半は修正後)
2.読み取り時 共有ロックを掛けた後(読み取り専用なので排他ロックをする必要はありません)、この時点で他のプログラムは書き込みを開始しますので、書き込みプログラムはロックを使用しません。ファイルを直接変更すると、以前と同じ問題が発生します
3. 最も理想的な状況は、読み取り時にロック (lock_sh) し、書き込み時にロック (lock_ex) することです。このようにして、書き込みプログラムは読み取りを待機します。
書き込み時:
複数の書き込みプログラムがロックせずにファイルに対して同時に動作する場合、最終データの一部はプログラム a によって書き込まれ、一部はプログラム a によって書き込まれる可能性があります。プログラム b
書き込み時にロックされている場合、他のプログラムがそれを読み取りに来た場合、何を読み取りますか?
1. リーダーが共有ロックを適用しない場合、ダーティ データを読み取ります。たとえば、プログラムを書く場合、a、b、c の 3 つの部分を書く必要があります。a を書いた後、このときに読み込むのは b です。次に、ab を書きます。このとき、読み取るのは abc です。
2. 読み取りプログラムが以前に共有ロックを申請していた場合、読み取りプログラムは書き込みプログラムが abc の書き込みを完了するのを待ってから読み取ります。
よく書かれたブログ投稿もあります:
http://hxsdit.com/1110

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。
