ホームページ バックエンド開発 PHPチュートリアル PHP_PHP チュートリアルでプロセス間通信を実装する

PHP_PHP チュートリアルでプロセス間通信を実装する

Jul 21, 2016 pm 04:08 PM
php 存在する どうやって 成し遂げる 意思 環境 話し合う プロセス コミュニケーション

PHP におけるプロセス間通信

Qiu Wenyu

この記事では、PHP4 環境でプロセス間通信メカニズムである IPC (Inter-Process-Communication) を使用する方法について説明します。この記事で説明するソフトウェア環境は linux+php4.0.4 以降です。まず、PHP4 と UNIX がインストールされていることを前提としています。php4 で共有メモリとセマフォを使用するには、php4 プログラムのコンパイル時に 2 つの拡張モジュール shmop と sysvsem をアクティブにする必要があります。
実装方法:PHPのセットアップ(configure)時に以下のオプションを追加します。
--enable-shmop --enable-sysvsem
これにより、PHP システムが関連する IPC 関数を処理できるようになります。
IPCとは何ですか?
IPC (プロセス間通信) は、同じホスト上の異なるプロセスが相互に通信する方法を提供する Unix 標準通信メカニズムです。 IPC には、共有メモリ、セマフォ、メッセージ キューという 3 つの基本的な処理メカニズムがあります。この記事では、主に共有メモリとセマフォの使用について説明します。メッセージキューについては、近いうちに具体的に紹介する予定です。
PHP での共有メモリ セグメントの使用
異なる処理プロセス間で共有メモリを使用することは、異なるプロセス間の通信を実現する良い方法です。 1 つのプロセスで共有メモリに情報を書き込むと、他のすべてのプロセスも書き込まれたデータを参照できます。とても便利。 PHP の共有メモリを利用すると、異なるプロセスが同じ PHP スクリプトを実行したときに異なる結果を得ることができます。または、同時に実行されている PHP の数に対するリアルタイム クエリを実装するなど。
共有メモリを使用すると、2 つ以上のプロセスが特定のストレージ領域を共有できます。クライアントとサーバーの間でデータをコピーする必要がないため、これは最も高速なタイプの IPC です。共有メモリを使用する唯一のコツは、複数のプロセスが特定のメモリ領域に同時にアクセスすることです。
共有メモリセグメントを作成するには?次のコードは、共有メモリの作成に役立ちます。
$shm_id = shmop_open($key, $mode, $perm, $size);
PHP では、shmop_open は作成された共有メモリ セグメントの ID を返すことに注意してください。 $shm_id を使用します。 $key は、共有メモリ セグメントを論理的に表す Key 値です。異なるプロセスは、同じキー ID を選択する限り、同じストレージ セグメントを共有できます。 $mode は共有メモリ セグメントの使用方法を指定するため、文字列 (ファイル名など) のハッシュ値を使用するのが一般的です。これは新規作成であるため、値は「c」、つまり作成を意味します。作成した共有メモリにアクセスする場合は、アクセスを意味する「a」を使用してください。 $perm パラメータは、アクセス許可を 8 進形式で定義します。許可の定義については、UNIX ファイル システムのヘルプを参照してください。 $size は共有メモリのサイズを定義します。 fopen (ファイル処理) に少し似ていますが、ファイル処理と同じと考えるべきではありません。これについては後の説明で少し説明します。
例:
$shm_id = shmop_open(0xff3, "c", 0644, 100);
ここでは、キー値 0xff3 –rw-r—r— 形式、サイズ 100 バイトの共有メモリ セグメントを開きます。
既存の共有メモリセグメントにアクセスする必要がある場合は、shmop_open を呼び出すときに 3 番目と 4 番目のパラメータを 0 に設定する必要があります。
IPC 動作ステータスのクエリ
Unix では、コマンド ライン プログラム ipcs を使用して、システム内のすべての IPC リソースのステータスをクエリできます。ただし、一部のシステム要件ではスーパーユーザーが実行する必要があります。下の図は、ipcs の実行結果の一部です。


上の図では、システムに 4 つの共有メモリ セグメントが表示されています。4 番目のキーの値は 0x00000ff3 で、先ほど実行した PHP プログラムによって作成されたものであることに注意してください。 ipcs の使用方法については、UNIX ユーザー マニュアルを参照してください。
共有メモリを解放するにはどうすればよいですか?
共有メモリを解放する方法は、PHP 命令を呼び出すことです: shmop_delete($id)
shmop_delete($id);
$id は shmop_open を呼び出して保存した shmop_op の戻り値です。もう 1 つの方法は、UNIX 管理コマンド
ipcrm id を使用することです。この ID は、ipcs を使用して表示される ID であり、プログラム内の $id とは異なります。ただし、ipcrm を使用して共有メモリ セグメントを直接削除すると、この状況を認識していない他のプロセスが、存在しないこの共有メモリを参照するときに予期しないエラー (多くの場合、好ましくない結果を伴う) を引き起こす可能性があることに注意してください。
共有メモリの使い方(読み書き)
共有メモリにデータを書き込むには以下の関数を使用します
int shmop_write (int shmid, string data, int offset)
shmid は shmop_open から返されるハンドルです。 $Data 変数には、保存するデータが保存されます。 $offset は、共有メモリの先頭から最初のバイトを書き込む位置(0 から始まります)を記述します。
読み取り操作は次のとおりです:
string shmop_read (int shmid, int start, int count)
同様に、$shmid、開始オフセット (0 から開始)、および合計読み取り数を指定します。結果の文字列を返します。このようにして、共有メモリ セグメントをバイト配列として扱うことができます。いくつか読んだり、いくつか書いたりできるので、とても便利です。
マルチプロセスの問題の考察
さて、別のプロセスでは、各プロセスによって書き込まれたデータが順番に 4 つの画像の混合シーケンスにランダムに表示されます。これは明らかに容認できません。この問題を解決するには、相互排他メカニズムを導入する必要があります。相互排他メカニズムについては、多くのオペレーティング システムの教科書で詳しく説明されているため、ここでは繰り返しません。相互排除メカニズムを実装する最も簡単な方法は、セマフォを使用することです。セマフォは、プロセス間通信 (IPC) の別の方法であり、他の IPC メカニズム (パイプライン、FIFO、メッセージ キュー) とは異なります。複数のプロセスによる共有データの保存を制御するために使用されるカウンターです。同様に、ipcs および ipcrm を使用して、セマフォのステータスを照会し、セマフォを削除できます。 PHP では、次の関数を使用して新しいセマフォを作成し、セマフォへのハンドルを返すことができます。キーが指すセマフォがすでに存在する場合、sem_get はセマフォを操作するためのハンドルを直接返します。
int sem_get (int key [, int max_acquire ][, int perm]])
$max_acquire は、シグナルが解放されるのを待たずにシグナルに同時に入るために使用できるプロセスの数 (つまり、最大数) を示します。特定のリソースを同時に処理できるプロセスの数。通常、値は 1 です)。 $perm はアクセス許可を指定します。
セマフォの所有に成功したら、それに対してできることは 2 つだけです: 要求と解放です。リリース操作を実行すると、システムは信号値を 1 つ減らします。 0未満の場合は0に設定してください。要求された操作を実行すると、システムはシグナル値を 1 つ増やします。その値が設定された最大値よりも大きい場合、システムは他のプロセスが最大値未満の値に解放されるまで処理プロセスを一時停止します。通常の状況では、最大値は 1 に設定されているため、プロセスがリクエストを取得すると、後続の他のプロセスはそのリクエストがミューテックス領域から出るまで待機し、セマフォを解放してからミューテックス領域に入って排他モードに設定します。同時に。このようなセマフォは、バイナリ セマフォと呼ばれることがよくあります。もちろん、初期値が正の数値であれば、それは共有アプリケーションで使用できる共有リソース ユニットの数を示します。
アプリケーションおよびリリース操作の PHP 形式は次のとおりです:
int sem_acquire (int sem_identifier) apply
int sem_release (int sem_identifier) release
ここで、sem_identifier は sem_get 呼び出しの戻り値 (ハンドル) です。
相互排他プロトコルの簡単な例
以下は、非常に簡単な相互排他操作手順です。
$semid=sem_get(0xee3,1,0666);
$shm_id = shmop_open(0xff3, "c", 0644, 100);
sem_acquire($semid); //適用
/* クリティカルを入力Area*/
ここでは、共有メモリが処理されます
sem_release($semid); //Release
ご覧のとおり、相互排除の実装は非常に簡単です: クリティカル エリアに入るために適用します。クリティカル エリアに適用します。 エリア リソースに対する操作 (共有メモリの変更など) を実行し、クリティカル セクションを終了して信号を解放します。これにより、2 つのプロセスが同じタイム スライス内の同じ共有メモリ上で動作することが不可能になります。セマフォ メカニズムにより、タイム スライスに入ることができるのは 1 つのプロセスだけであることが保証されるため、他のプロセスは、現在処理されているプロセスが完了するまで待ってから入る必要があります。
クリティカル セクションは通常、同時に複数のプロセスによる同時処理を許可しないコード セグメントを指します。
PHP では、それが占有しているセマフォは同じプロセスによって解放される必要があることに注意してください。一般的なシステムでは、プロセスは他のプロセスが占有しているシグナルを解放できます。クリティカル セクションのコードを作成するときは、A が B を待ち、B が A を待つというデッドロック状況を避けるために、リソースの割り当てを慎重に設計する必要があります。
使用法
IPCは広く使用されています。たとえば、説明された複雑な設定ファイルや特定のユーザー設定などを異なるプロセス間で保存して、処理の重複を回避します。また、共有メモリ テクノロジを使用して、多数の PHP スクリプトが参照する必要がある大きなファイルを共有メモリに配置しました。これにより、Web サービスの速度が大幅に向上し、いくつかのボトルネックが解消されました。用途としては、チャットルームやマルチキャストなどがあります。 IPC の力はあなたの想像力にかかっています。この記事が少しでもあなたのお役に立てれば光栄です。この魅力的なコンピューター技術についてぜひ皆さんと議論したいと思っています。メール: qwyaxm@163.net

www.bkjia.com本当http://www.bkjia.com/PHPjc/314816.html技術記事 PHP でのプロセス間通信の実装 Qiu Wenyu この記事では、PHP4 環境でプロセス間通信メカニズムである IPC (Inter-Process-Communication) を使用する方法について説明します。この記事で説明するソフトウェア環境は linux+p...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPの目的:動的なWebサイトの構築 PHPの目的:動的なWebサイトの構築 Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPとPython:彼らの歴史を深く掘り下げます PHPとPython:彼らの歴史を深く掘り下げます Apr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

なぜPHPを使用するのですか?利点と利点が説明されました なぜPHPを使用するのですか?利点と利点が説明されました Apr 16, 2025 am 12:16 AM

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。

PHPの影響:Web開発など PHPの影響:Web開発など Apr 18, 2025 am 12:10 AM

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHP対Python:ユースケースとアプリケーション PHP対Python:ユースケースとアプリケーション Apr 17, 2025 am 12:23 AM

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。

PHPの継続的な使用:その持久力の理由 PHPの継続的な使用:その持久力の理由 Apr 19, 2025 am 12:23 AM

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

See all articles