单台服务器的PHP进程之间实现共享内存的方法_php技巧
开发人员要想使php进程实现共享内存的读写,首先就要支持IPC函数,即php编译安装时指定:--enable-shmop 与--enable-sysvsem 两个选项。
IPC (Inter-process communication) 是一个Unix标准机制,它提供了使得在同一台主机不同进程之间可以互相的方法。基本的IPC处理机制有3种:它们分别是共享内存、信号量和消息队列。本文中我们主要讨论共享内存和信号量的使用。
在不同的处理进程之间使用共享内存是一个实现不同进程之间相互的好方法。如果你在一个进程中向所共享的内存写入一段信息,那么所有其他的进程也可以看到这段被写入的数据。非常方便。在PHP中有了共享内存的帮助,你可以实现不同进程在运行同一段PHP脚本时返回不同的结果。或实现对PHP同时运行数量的实时查询等等。
共享内存允许两个或者多个进程共享一给定的存储区。因为数据不需要在客户机和服务器之间复制,所以这是最快的一种IPC。使用共享内存的唯一窍门是多个进程对一给定存储区的同步存取。
如何建立一个共享内存段呢?下面的代码可以帮你建立共享内存。
注意,每个共享内存段都有一个唯一的ID, 在PHP中,shmop_open会把建立好的共享内存段的ID返回,这里我们用$shm_id记录它。而$key是一个我们逻辑上表示共享内存段的Key值。不同进程只要选择同一个Key id就可以共享同一段存储段。习惯上我们用一个串(类似文件名一样的东西)的散列值作为key id. $mode指明了共享内存段的使用方式。这里由于是新建,因此值为'c' –取create之意。如果你是已经建立过的共享内存那么请用'a', 取access之意。$perm参数定义了的权限,8进制,关于权限定义请看UNIX文件系统帮助。$size定义了共享内存的大小。尽管有点象fopen(文件处理)你可不要当它同文件处理一样。后面的描述你将看到这一点。
例如:
这里我们打开了一个共享内存段 键值0xff3 –rw-r—r—格式,大小为100字节。
如果需要已有的共享内存段,你必须在调用shmop_open中设第3、4个参数为0。
在Unix下,你可以用一个命令行程序ipcs查询系统所有的IPC资源状态。不过有些系统要求需要超级用户方能执行。下图是一段ipcs的运行结果。
上图中系统显示了4个共享内存段,注意其中第4个键值为0x00000ff3的就是我们刚刚运行过的PHP程序所创建的。关于ipcs的用法请参考UNIX用户手册。
如何释放共享内存呢
释放共享内存的办法是调用PHP指令:shmop_delete($id)
$id 就是你调用shmop_open所存的shmop_op的返回值。还有一个办法就是用UNIX的管理指令:
ipcrm id, id就是你用ipcs看到的ID.和你程序中的$id不一样。不过要小心,如果你用ipcrm直接删除共享内存段那么有可能导致其他不知道这一情况的进程在引用这个已经不复存在的共享内存器时出现一些不可预测的错误(往往结果不妙)。
如何使用(读写)共享内存呢
使用如下所示函数向共享内存写入数据
其中shmid是用shmop_open返回的句柄。$Data变量存放了要存放的数据。$offset描述了写入从共享内存的开始第一个字节的位置(以0开始)。
读取操作是:
同样,指明$shmid,开始偏移量(以0开始)、总读取数量。返回结果串。这样,你就可以把共享内存段当作是一个字节数组。读几个再写几个,想干嘛就干嘛,十分方便。
现在,在单独的一个PHP进程中读写、创建、删除共享内存方面上你应该没有问题了。但是,显然实际运行中不可能只是一个PHP进程在运行中。如果在多个进程的情况下你还是沿用单个进程的处理方法,你一定会碰到问题--著名的并行和互斥问题。比如说有2个进程同时需要对同一段内存进行读写。当两个进程同时执行写入操作时,你将得到一个错误的数据,因为该段内存将之可能是最后执行的进程的内容,甚至是由2个进程写入的数据轮流随机出现的一段混合的四不象。这显然是不能接受的。为了解决这个问题,我们必须引入互斥机制。互斥机制在很多操作系统的教材上都有专门讲述,这里不多重复。实现互斥机制的最简单办法就是使用信号灯。信号量是另外一种进程间(IPC)的方式,它同其他IPC机构(管道、FIFO、消息队列)不同。它是一个记数器,用于控制多进程对共享数据的存储。同样的是你可以用ipcs和ipcrm实现对信号灯使用状态的查询和对其实现删除操作。在PHP中你可以用下列函数创建一个新的信号量并返回操作该信号量的句柄。如果该key指向的信号量已经存在,sem_get直接返回操作该信号量的句柄。
$max_acquire 指明同时最多可以用几个进程进入该信号而不必等待该信号被释放(也就是最大同时处理某一资源的进程数目,一般该值均为一)。$perm指明了权限。
一旦你成功的拥有了一个信号量,你对它所能做的只有2种:请求、释放。当你执行释放操作时, 系统将把该信号值减一。如果小于0那就还设为0。而当你执行请求操作时,系统将把该信号值加一,如果该值大于设定的最大值那么系统将挂起你的处理进程直到其他进程释放到小于最大值为止。一般情况下最大值设为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: プロセス間通信 マルチプロセス プログラミングでは、プロセス間の通信は基本的な要件です。ただし、プロセスには独自の特徴があるため、

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

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

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