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

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

Jul 13, 2016 am 10:28 AM
共有メモリ

開発者が 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 までご連絡ください。

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

win10gpu共有メモリをオフにする方法 win10gpu共有メモリをオフにする方法 Jan 12, 2024 am 09:45 AM

コンピューターにある程度詳しい友人なら、GPU には共有メモリがあることを知っているはずですが、多くの友人は、共有メモリによってメモリの数が減り、コンピューターに影響が出るのではないかと心配して、GPU をオフにしたいと考えています。見る。 win10gpu 共有メモリをオフにする: 注: GPU の共有メモリをオフにすることはできませんが、その値を最小値に設定することはできます。 1. 起動時に DEL を押して BIOS に入ります。一部のマザーボードでは、F2/F9/F12 を押して入る必要があります。BIOS インターフェイスの上部には、「メイン」、「詳細」、その他の設定を含む多くのタブがあります。「チップセット」を見つけます。 " オプション。以下のインターフェイスで SouthBridge 設定オプションを見つけ、Enter をクリックして入力します。

Golang関数における複数プロセス間の共有メモリの適用方法 Golang関数における複数プロセス間の共有メモリの適用方法 May 17, 2023 pm 12:52 PM

同時実行性の高いプログラミング言語である Golang の組み込みコルーチン メカニズムとマルチスレッド操作により、軽量のマルチタスクが可能になります。ただし、マルチプロセス処理シナリオでは、異なるプロセス間の通信と共有メモリがプログラム開発の重要な問題になります。この記事では、Golangで複数プロセス間で共有メモリを実現する応用方法を紹介します。 1. Golang でマルチプロセスを実装する方法 Golang では、fork、os.Process、

PHP共有メモリ機能の使い方と応用 PHP共有メモリ機能の使い方と応用 Jun 16, 2023 pm 12:27 PM

PHPの共有メモリ機能の使い方と応用 共有メモリとは、複数のプロセスが同じメモリ空間に同時にアクセスする技術のことです。並行プログラミングでは、共有メモリをプロセス間通信に使用して、異なるプロセス間でのデータ共有を実現できます。 PHP には、関連する共有メモリ関数も用意されています。この記事では、PHP 共有メモリ関数の使用法を紹介し、いくつかの実用的なアプリケーション シナリオを検討します。共有メモリ関数の使用 PHP は、PHP がシステム共有メモリ上で動作できるようにする shmop 拡張モジュールを提供します。この拡張モジュールが提供する機能

C++ での共有メモリとメッセージ キューの使用 C++ での共有メモリとメッセージ キューの使用 Aug 22, 2023 pm 04:21 PM

C++ では、共有メモリとメッセージ キューの 2 つが一般的に使用されるプロセス間通信方法です。これらは、異なるプロセス間でデータや情報を共有するのに役立ち、より効率的なプログラミングを可能にします。共有メモリは、複数のプロセスで共有できる特別なメモリ領域です。共有メモリを使用すると、データのコピーのオーバーヘッドが回避され、プロセス間のデータ転送の遅延が軽減されます。 C++ で共有メモリを使用するには、<sys/shm.h> ヘッダー ファイルをインクルードし、shmget、shmat、sh を使用する必要があります。

マルチプロセス プログラミングで発生する Python の問題とその解決策 マルチプロセス プログラミングで発生する Python の問題とその解決策 Oct 08, 2023 pm 04:57 PM

マルチプロセス プログラミングで発生する Python の問題とその解決策には、特定のコード サンプルが必要です。Python では、マルチプロセス プログラミングは一般的に使用される同時プログラミング手法です。マルチコアプロセッサを効果的に活用し、プログラムの実行効率を向上させます。ただし、マルチプロセス プログラミングを行う場合には、いくつかの問題も発生します。この記事では、いくつかの一般的な問題を紹介し、対応する解決策とコード例を示します。質問 1: プロセス間通信 マルチプロセス プログラミングでは、プロセス間の通信は基本的な要件です。ただし、プロセスには独自の特徴があるため、

Goで共有メモリGoroutineを作成するにはどうすればよいですか? Goで共有メモリGoroutineを作成するにはどうすればよいですか? Jun 02, 2024 am 11:32 AM

共有メモリ ゴルーチンはチャネルを通じて実装できます。チャネルを作成して要素タイプを指定します。 Goroutine を開始してチャネルにデータを書き込みます。メインの Goroutine で範囲ループを使用して、チャネルからデータを読み取ります。書き込みの完了は、チャネルを閉じることによって示されます。

Redis と D 言語を使用して共有メモリ機能を開発する方法 Redis と D 言語を使用して共有メモリ機能を開発する方法 Sep 22, 2023 am 09:57 AM

Redis と D 言語を使用して共有メモリ機能を開発する方法の概要: コンピューター アプリケーションの複雑さとデータ処理の需要が増加するにつれて、共有メモリはデータ交換の一般的に使用される方法になりました。 Redis は、豊富なデータ構造とサポートを提供する高性能インメモリ データベースです。この記事では、Redis と D 言語を使用して共有メモリ機能を開発する方法を紹介し、具体的なコード例を添付します。ステップ 1: Redis と D 言語コンパイラーをインストールする まず、Redis と D 言語コンパイラーをコンピューターにインストールする必要があります。赤

PHP マルチスレッド プログラミングの実践: マルチプロセス通信に共有メモリを使用する PHP マルチスレッド プログラミングの実践: マルチプロセス通信に共有メモリを使用する Jun 29, 2023 pm 12:50 PM

PHP は Web 開発で広く使用されているスクリプト言語であり、通常は単一のスレッドで実行されます。ただし、特定のシナリオでは、プログラムのパフォーマンスと効率を向上させるためにマルチスレッド プログラミングを使用する必要がある場合があります。この記事では、PHP でマルチスレッド プログラミングを実行し、共有メモリを使用して複数のプロセス間の通信を実現する方法を紹介します。まず、マルチスレッド プログラミングと共有メモリとは何かを理解する必要があります。マルチスレッド プログラミングは、プログラムが複数のスレッドを同時に実行できるようにする同時プログラミングの方法であり、それによってプログラムの実行が向上します。

See all articles