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

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

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

操作の有効性と整合性を確保するために、ロック機構を通じて同時状態を直列状態に変換できます。 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 までご連絡ください。

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles