ホームページ >バックエンド開発 >PHPチュートリアル >単一サーバー上の PHP プロセス間で共有メモリを実装する方法_PHP チュートリアル

単一サーバー上の PHP プロセス間で共有メモリを実装する方法_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:28:15894ブラウズ

開発者が php プロセスで共有メモリの読み書きを有効にしたい場合は、まず IPC 機能をサポートする必要があります。つまり、php をコンパイルしてインストールするときに、--enable-shmop と --enable-sysvsem の 2 つのオプションを指定します。

IPC (プロセス間通信) は、同じホスト上の異なるプロセスが相互に通信する方法を提供する Unix 標準メカニズムです。 IPC には、共有メモリ、セマフォ、メッセージ キューという 3 つの基本的な処理メカニズムがあります。この記事では、主に共有メモリとセマフォの使用について説明します。

異なる処理プロセス間で共有メモリを使用することは、異なるプロセス間の相互理解を達成するための良い方法です。 1 つのプロセスで共有メモリに情報を書き込むと、他のすべてのプロセスも書き込まれたデータを参照できます。とても便利。 PHP の共有メモリを利用すると、異なるプロセスが同じ PHP スクリプトを実行したときに異なる結果を得ることができます。または、同時に実行されている PHP の数に対するリアルタイム クエリを実装するなど。

共有メモリを使用すると、2 つ以上のプロセスが特定のストレージ領域を共有できます。クライアントとサーバーの間でデータをコピーする必要がないため、これは最も高速なタイプの IPC です。共有メモリを使用する唯一のコツは、複数のプロセスが特定のメモリ領域に同時にアクセスすることです。

共有メモリセグメントを作成するには?次のコードは、共有メモリの作成に役立ちます。

コードをコピーします コードは次のとおりです:
$shm_id = shmop_open($key, $mode, $perm, $size);

各共有メモリ セグメントには一意の ID があることに注意してください。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 に設定する必要があります。

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から開始)、総読み取り数を指定します。結果の文字列を返します。このようにして、共有メモリ セグメントをバイト配列として扱うことができます。いくつか読んだり、いくつか書いたりできるので、とても便利です。

これで、単一の PHP プロセスで共有メモリの読み取り、書き込み、作成、削除を問題なく行うことができるはずです。ただし、実際の運用では PHP プロセスを 1 つだけ実行することは当然不可能です。複数プロセスの場合でも単一プロセスの処理方法を使用すると、必ず問題が発生します。有名な並列処理と相互排他の問題です。たとえば、同じメモリを同時に読み書きする必要がある 2 つのプロセスがあるとします。 2 つのプロセスが同時に書き込み操作を実行すると、メモリ セグメントが最後に実行されたプロセスの内容であるか、2 つのプロセスが順番に書き込んだデータがランダムに混在している可能性があるため、誤ったデータが取得されます。イメージが違います。これは明らかに容認できません。この問題を解決するには、相互排除メカニズムを導入する必要があります。相互排他メカニズムについては、多くのオペレーティング システムの教科書で詳しく説明されているため、ここでは繰り返しません。 相互排他メカニズムを実装する最も簡単な方法は、セマフォを使用することです。セマフォは別のプロセス間 (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 に設定されているため、プロセスがリクエストを取得すると、後続の他のプロセスはそのリクエストがミューテックス領域から出るまで待機し、セマフォを解放してからミューテックス領域に入って排他モードに設定します。同時に。このようなセマフォは、バイナリ セマフォと呼ばれることがよくあります。もちろん、初期値が正の数値の場合は、共有アプリケーションで使用できる共有リソース ユニットの数を示します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/802210.html技術記事開発者が PHP プロセスで共有メモリの読み書きを有効にしたい場合は、まず IPC 機能をサポートする必要があります。つまり、PHP のコンパイルおよびインストール時に 2 つのオプション --enable-shmop と --enable-sysvsem を指定する必要があります。 IPC (...
)
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。