検索
ホームページバックエンド開発PHPチュートリアルPHP のフロック ファイルの詳細な紹介 lock_PHP チュートリアル

PHP のフロック ファイルの詳細な紹介 lock_PHP チュートリアル

Jul 13, 2016 pm 05:14 PM
flockphpのために導入そして誠実さ意思同時操作する書類効果機構確認する詳しい説明ロック

操作の有効性と整合性を確保するために、ロック機構を通じて同時状態を直列状態に変換できます。 PHP のファイル ロックもロック メカニズムの 1 つであり、リソースの競合に対処するように設計されています。大量の同時実行の場合、fwrite を使用してデータをファイルの末尾に複数回書き込みます。ロックしないとどうなるでしょうか。複数の順序付けされた書き込み操作は 1 つのトランザクションに相当し、この時点でこのトランザクションの整合性を確保する必要があります。

bool flock ( int ハンドル, int 操作 [, int &wouldblock] );
flock() 操作のハンドルは、開いているファイル ポインターである必要があります。操作は次のいずれかの値になります:

1. 共有ロック(リーダー)を取得するには、操作を LOCK_SH に設定します(PHP 4.0.1 より前のバージョンは 1 に設定されます)
2. 排他的ロック (ライター) を取得するには、操作を LOCK_EX に設定します (PHP 4.0.1 より前のバージョンでは 2 に設定)
3. ロック (共有または排他) を解放するには、操作を LOCK_UN に設定します (PHP 4.0.1 より前のバージョンでは 3 に設定)
4. ロック時に flock() をブロックしたくない場合は、操作に LOCK_NB を追加します (PHP 4.0.1 より前のバージョンでは 4 に設定)

2つのファイルを作成します

。 b.php を次のように変更します:
コードは次のとおりです コードをコピー

(1) a.php

?$file = "temp.txt"; $fp = fopen($file , 'w'); if(flock($fp , LOCK_EX)){
fwrite($fp, "abcn"); 睡眠(10); fwrite($fp, "123n"); 群れ($fp, LOCK_UN); }
fclose($fp);

(2) b.php

?$file = "temp.txt"; $fp = fopen($file , 'r'); エコー fread($fp, 100); fclose($fp);

a.php を実行した後、すぐに b.php を実行すると、出力が表示されます:

ABC
a.php の実行が終了したら、b.php を実行すると、出力が表示されます:
ABC
123

当然ですが、a.phpがファイルを書き込むとデータが大きすぎて時間がかかりますが、このときb.phpは不完全なデータを読み込みます



コードは次のとおりです

コードをコピー

?$file = "temp.txt"; $fp = fopen($file , 'r'); if(flock($fp , LOCK_EX)){ エコー fread($fp, 100); 群れ($fp, LOCK_UN); }その他{ echo "ファイルのロックに失敗しました...n"; } a.php を実行した後、すぐに b.php を実行します。 b.php は、a.php が完了するまで (つまり 10 秒後) 待機してから次のように表示されることがわかります。 ABC 123
fclose($fp);
データの読み取りは完了しましたが、時間が長すぎるため、書き込みロックが解除されるまで待たなければなりません。

b.php を次のように変更します:



コードは次のとおりです

コードをコピー
?$file = "temp.txt"; $fp = fopen($file , 'r'); if(flock($fp , LOCK_SH | LOCK_NB)){

エコー fread($fp, 100); 群れ($fp, LOCK_UN); }その他{
echo "ファイルのロックに失敗しました...n"; }
fclose($fp);

a.php を実行した後、すぐに b.php を実行すると、出力が表示されます:
ファイルのロックに失敗しました…
上記のように長時間待たずに、ロックファイル失敗ステータスを返せることが証明されました。

結論:

ファイルをキャッシュするときは、関連するロックを選択することをお勧めします。そうしないと、読み取られたデータが不完全になったり、データが繰り返し書き込まれたりする可能性があります。
File_get_contents はデフォルトでどのようなロックを使用するのかわかりません。とにかく、ロックしないと得られる出力は不完全なデータと同じです。
ファイルのキャッシュを実行したいので、書き込みロックがあるかどうかを知る必要があるだけで、ある場合はデータベースをチェックするだけです。


同時に複数回実行すると、100 行が書き込まれましたが、トランザクション 1 とトランザクション 2 のデータがインターリーブされ、望んだ結果ではありませんでした。現時点で必要なのは、トランザクションの完全な実行です。最初のトランザクションの実行後に 2 番目のトランザクションが確実に実行されるようにするメカニズムが必要です。 PHP では、flock 関数がこの使命を達成します。トランザクション 1 とトランザクション 2 のループの前に flock($fp, LOCK_EX); を追加すると、ニーズを満たし、2 つのトランザクションをシリアル化できます。

トランザクションが flock を完了すると、ここで追加したのは LOCK_EX (排他ロック) であるため、トランザクションが完了した後でのみ、リソースに対するすべての操作がブロックされます。現在時刻を出力することでこれを確認できます。

末尾への追加に関して、Unix システムの初期のバージョンには同時書き込みの問題があります。末尾に追加したい場合は、最初に位置をシークしてから書き込む必要があります。複数のプロセスが同時に動作する場合、同時実行性による上書き書き込みの問題が発生します。つまり、2 つのプロセスが同時に末尾オフセットを取得した後、次々に書き込み操作が実行され、後続の操作が上書きされてしまいます。以前の操作。この問題は、後に開くときに O_APPEND 操作を追加することで解決されました。これにより、検索操作と書き込み操作がアトミック操作に変わりました。

PHP の fopen 関数の実装では、a パラメーターを使用してファイルの末尾にコンテンツを追加する場合、open 関数呼び出しの oflag パラメーターは O_CREAT|O_APPEND になります。つまり、同時追加について心配する必要はありません。追加操作を使用する場合の書き込み。

Flock ファイル ロックは、PHP セッションのデフォルトのストレージ実装でも使用されます。セッションが開始されると、PS_READ_FUNC が呼び出され、O_CREAT | O_RDWR | O_BINARY でセッション データ ファイルが開かれます。他のプロセスがこのファイルにアクセスした場合 (つまり、同じユーザーが現在のファイルに対するリクエストを再度開始した場合)、ページがロード中であり、プロセスがブロックされていることが表示されます。書き込みロックを追加する開始点は、このセッションのセッション操作トランザクションが完全に実行できることを確認し、他のプロセスからの干渉を防ぎ、データの一貫性を確保することです。ページ上でセッション変更操作がない場合は、できるだけ早く session_write_close() を呼び出してロックを解放できます。

ファイルロックはファイルのロックです。この解釈に加えて、ファイルをロックとして使用することもできます。実際の作業では、単一のプロセスを確実に実行するために、プログラムの実行前にファイルが存在するかどうかを判断し、存在しない場合は空のファイルを作成し、存在する場合はプロセスの終了後に空のファイルを削除することがあります。 、実行されません。

しかし、lock_ex をいつ使用し、lock_sh をいつ使用するのでしょうか?

読書中:

ダーティなデータを表示したくない場合は、lock_sh 共有ロックを使用するのが最善です。次の 3 つの状況が考えられます:
1. 読み取り時に共有ロックが追加されていない場合、他のプログラムが書き込みを行う場合は (書き込みがロックされているかどうかに関係なく)、書き込みは直ちに成功します。ちょうど半分を読み取って、それが別のプログラムによって書き込まれた場合、読み取った後半は前半と一致しない可能性があります (前半は変更前、後半は変更後です)
2. 読み取り時に共有ロックが追加されている場合 (読み取りだけなので排他ロックを使用する必要はありません)、この時点で他のプログラムが書き込みを開始し、書き込みプログラムはロックを使用しません。プログラムを書くとファイルを直接変更することになるため、前と同じ質問が発生します
3. 最も理想的な状況は、読み取り時にロック (lock_sh) し、書き込み時にロック (lock_ex) することです。この方法では、書き込みプログラムは読み取りプログラムが完了するのを待ってから動作するため、無謀な操作は発生しません。

執筆時:


複数の書き込みプログラムがロックせずにファイルに対して同時に動作する場合、最終データの一部はプログラム a によって書き込まれ、一部はプログラム b によって書き込まれる可能性があります
書き込み時にロックされていて、この時点で別のプログラムがそれを読み取りに来た場合、何を読み取るでしょうか?
1. リーダーが共有ロックを適用しない場合、ダーティ データを読み取ります。たとえば、プログラムを書く場合、a、b、c の 3 つの部分を書く必要があります。a を書いた後、このときに読み込むのは b です。次に、ab を書きます。このとき読むのは「abc」です。 2. 読み取りプログラムが以前に共有ロックを申請したことがある場合、読み取りプログラムは書き込みプログラムが abc の書き込みを完了するまで待機し、読み取り前にロックを解放します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/628961.html技術記事操作の有効性と整合性を保証するために、ロック機構を通じて同時状態をシリアル状態に変換できます。 PHP のファイル ロックもロック メカニズムの 1 つであり、リソースの競合に対処するように設計されています。 ...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPセッションを失敗させる可能性のあるいくつかの一般的な問題は何ですか?PHPセッションを失敗させる可能性のあるいくつかの一般的な問題は何ですか?Apr 25, 2025 am 12:16 AM

PHPSESSIONの障害の理由には、構成エラー、Cookieの問題、セッションの有効期限が含まれます。 1。構成エラー:正しいセッションをチェックして設定します。save_path。 2.Cookieの問題:Cookieが正しく設定されていることを確認してください。 3.セッションの有効期限:セッションを調整してください。GC_MAXLIFETIME値はセッション時間を延長します。

PHPでセッション関連の問題をどのようにデバッグしますか?PHPでセッション関連の問題をどのようにデバッグしますか?Apr 25, 2025 am 12:12 AM

PHPでセッションの問題をデバッグする方法は次のとおりです。1。セッションが正しく開始されるかどうかを確認します。 2.セッションIDの配信を確認します。 3.セッションデータのストレージと読み取りを確認します。 4.サーバーの構成を確認します。セッションIDとデータを出力し、セッションファイルのコンテンツを表示するなど、セッション関連の問題を効果的に診断して解決できます。

session_start()が複数回呼び出されるとどうなりますか?session_start()が複数回呼び出されるとどうなりますか?Apr 25, 2025 am 12:06 AM

session_start()への複数の呼び出しにより、警告メッセージと可能なデータ上書きが行われます。 1)PHPは警告を発し、セッションが開始されたことを促します。 2)セッションデータの予期しない上書きを引き起こす可能性があります。 3)session_status()を使用してセッションステータスを確認して、繰り返しの呼び出しを避けます。

PHPでセッションのライフタイムをどのように構成しますか?PHPでセッションのライフタイムをどのように構成しますか?Apr 25, 2025 am 12:05 AM

PHPでのセッションライフサイクルの構成は、session.gc_maxlifetimeとsession.cookie_lifetimeを設定することで達成できます。 1)session.gc_maxlifetimeサーバー側のセッションデータのサバイバル時間を制御します。 0に設定すると、ブラウザが閉じているとCookieが期限切れになります。

セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール