単一サーバー上の PHP プロセス間で共有メモリを実装する方法_PHP チュートリアル
開発者が php プロセスで共有メモリの読み書きを有効にしたい場合は、まず IPC 機能をサポートする必要があります。つまり、php をコンパイルしてインストールするときに、--enable-shmop と --enable-sysvsem の 2 つのオプションを指定します。 。
IPC (プロセス間通信) は、同じホスト上の異なるプロセスが相互に通信する方法を提供する Unix 標準メカニズムです。 IPC には、共有メモリ、セマフォ、メッセージ キューという 3 つの基本的な処理メカニズムがあります。この記事では、主に共有メモリとセマフォの使用について説明します。
異なる処理プロセス間で共有メモリを使用することは、異なるプロセス間の相互理解を達成するための良い方法です。 1 つのプロセスで共有メモリに情報を書き込むと、他のすべてのプロセスも書き込まれたデータを参照できます。とても便利。 PHP の共有メモリを利用すると、異なるプロセスが同じ PHP スクリプトを実行したときに異なる結果を得ることができます。または、同時に実行されている PHP の数に対するリアルタイム クエリを実装するなど。
共有メモリを使用すると、2 つ以上のプロセスが特定のストレージ領域を共有できます。クライアントとサーバーの間でデータをコピーする必要がないため、これは最も高速なタイプの IPC です。共有メモリを使用する唯一のコツは、複数のプロセスが特定のメモリ領域に同時にアクセスすることです。
共有メモリセグメントを作成するには?次のコードは、共有メモリの作成に役立ちます。
各共有メモリ セグメントには一意の ID があることに注意してください。PHP では、shmop_open は作成された共有メモリ セグメントの ID を返します。ここでは $shm_id を使用してそれを記録します。 $key は、共有メモリ セグメントを論理的に表す Key 値です。異なるプロセスは、同じキー ID を選択する限り、同じストレージ セグメントを共有できます。 $mode は共有メモリ セグメントの使用方法を指定するため、文字列 (ファイル名など) のハッシュ値を使用するのが一般的です。これは新規作成であるため、値は「c」、つまり作成を意味します。すでに共有メモリを作成している場合は、アクセスを意味する「a」を使用してください。 $perm パラメータで定義される権限は 8 進形式です。権限の定義については、UNIX ファイル システムのヘルプを参照してください。 $size は共有メモリのサイズを定義します。 fopen (ファイル処理) に少し似ていますが、ファイル処理と同じと考えるべきではありません。これについては後の説明で説明します。 例:
既存の共有メモリセグメントが必要な場合は、shmop_open を呼び出すときに 3 番目と 4 番目のパラメータを 0 に設定する必要があります。
Unix では、コマンド ライン プログラム ipcs を使用して、システム内のすべての IPC リソースのステータスをクエリできます。ただし、一部のシステム要件ではスーパーユーザーが実行する必要があります。下の図は、ipcs の実行結果の一部です。
上の図では、システムに 4 つの共有メモリ セグメントが表示されています。4 番目のキー値は 0x00000ff3 で、先ほど実行した PHP プログラムによって作成されたものであることに注意してください。 ipcs の使用方法については、UNIX ユーザー マニュアルを参照してください。
共有メモリを解放する方法
共有メモリを解放する方法は、PHP コマンド shmop_delete($id) を呼び出すことです
ipcrm id、id は ipcs を使用して表示される ID であり、プログラム内の $id とは異なります。ただし、ipcrm を使用して共有メモリ セグメントを直接削除すると、この状況を認識していない他のプロセスが、存在しないこの共有メモリを参照するときに予期しないエラー (多くの場合、好ましくない結果を伴う) を引き起こす可能性があることに注意してください。
共有メモリの使い方(読み書き)
以下の関数を使用して共有メモリにデータを書き込みます
読み取り操作は次のとおりです:
同様に、$shmid、開始オフセット(0から開始)、総読み取り数を指定します。結果の文字列を返します。このようにして、共有メモリ セグメントをバイト配列として扱うことができます。いくつか読んだり、いくつか書いたりできるので、とても便利です。
これで、単一の PHP プロセスで共有メモリの読み取り、書き込み、作成、削除を問題なく行うことができるはずです。ただし、実際の運用では PHP プロセスを 1 つだけ実行することは当然不可能です。複数プロセスの場合でも単一プロセスの処理方法を使用すると、必ず問題が発生します。有名な並列処理と相互排他の問題です。たとえば、同じメモリを同時に読み書きする必要がある 2 つのプロセスがあるとします。 2 つのプロセスが同時に書き込み操作を実行すると、メモリ セグメントが最後に実行されたプロセスの内容であるか、2 つのプロセスが順番に書き込んだデータがランダムに混在している可能性があるため、誤ったデータが取得されます。イメージが違います。これは明らかに容認できません。この問題を解決するには、相互排除メカニズムを導入する必要があります。相互排他メカニズムについては、多くのオペレーティング システムの教科書で詳しく説明されているため、ここでは繰り返しません。 相互排他メカニズムを実装する最も簡単な方法は、セマフォを使用することです。セマフォは別のプロセス間 (IPC) メソッドであり、他の IPC メカニズム (パイプライン、FIFO、メッセージ キュー) とは異なります。複数のプロセスによる共有データの格納を制御するために使用されるカウンターです。同様に、ipcs および ipcrm を使用して、セマフォのステータスを照会し、セマフォを削除できます。 PHP では、次の関数を使用して新しいセマフォを作成し、セマフォへのハンドルを返すことができます。キーが指すセマフォがすでに存在する場合、sem_get はセマフォを操作するためのハンドルを直接返します。
$max_acquire は、シグナルが解放されるのを待たずにシグナルに同時に入るために使用できるプロセスの数を示します (つまり、特定のリソースを同時に処理できるプロセスの最大数。通常、値は1つ)。 $perm は権限を指定します。
セマフォの所有に成功したら、それに対してできることは 2 つだけです: 要求と解放です。リリース操作を実行すると、システムは信号値を 1 つ減らします。 0未満の場合は0に設定してください。要求された操作を実行すると、システムはシグナル値を 1 つ増やします。その値が設定された最大値よりも大きい場合、システムは他のプロセスが最大値未満の値に解放されるまで処理プロセスを一時停止します。通常の状況では、最大値は 1 に設定されているため、プロセスがリクエストを取得すると、後続の他のプロセスはそのリクエストがミューテックス領域から出るまで待機し、セマフォを解放してからミューテックス領域に入って排他モードに設定します。同時に。このようなセマフォは、バイナリ セマフォと呼ばれることがよくあります。もちろん、初期値が正の数値の場合は、共有アプリケーションで使用できる共有リソース ユニットの数を示します。
)
ホット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)

ホットトピック









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

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

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

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

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

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

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

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