PHP_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

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

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

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

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

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

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用して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で後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

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