php 共享内存-PHP共享显存

2023-08-31 0 5,160 百度已收录

varalimama_pid =“mm_10004949_102849_110534”;varalimama_titlecolor =“0000FF”;varalimama_descolor =“000000”;varalimama_bgcolor =“FFFFFF”;varalimama_bordercolor =“E6E6E6”;varalimama_linkcolor =“008000”; alimama_sizecode=“32”;varalimama_width=250;varalimama_height=300; varalima_type=2;

本文将讨论如何在PHP4环境下使用进程间通信机制——IPC(Inter-Process-Communication)。 本文讨论的软件环境是linux+php4.0.4或更高版本。 首先,我们假设您已经安装了 PHP4 和 UNIX。 为了让php4能够使用共享显存和信号量,在编译php4程序时必须激活shmop和sysvsem这两个扩展模块。

实现方法:在设置PHP(config)时添加以下选项。

--启用-shmop--启用-sysvsem

这将使您的 PHP 系统能够处理相关的 IPC 函数。

什么是IPC?

IPC(进程间通信)是一种Unix标准通信机制,它提供了使同一主机上的不同进程能够相互通信的技术。 IPC的基本处理机制有3种:共享内存信号量和消息队列。 本文我们主要讨论共享内存和信号量的使用。 关于消息队列,笔者近期会介绍。

在 PHP 中使用共享内存段

在不同处理进程之间使用共享视频内存是不同进程之间进行通信的好方法。 如果在一个进程中向共享显存写入一条信息,则所有其他进程也可以听到写入的数据。 很方便。 借助PHP中的共享显存,您可以实现不同的进程在运行相同的PHP脚本时返回不同的结果。 或者实现同时运行的PHP数量的实时查询等。

共享视频内存允许两个或多个进程共享给定的存储区域。 由于不需要在客户端和服务器之间复制数据,因此这是最快的 IPC 类型。 使用共享视频内存的唯一技巧是多个进程同时访问给定的内存区域。

如何建立共享显存段? 下面的代码可以帮助您提高共享视频内存。

$shm_id=shmop_open($key,$mode,$perm,$size);

请注意,每个共享视频内存段都有一个唯一的 ID。 在PHP中,shmop_open将返回构建的共享显存段的ID。 这里我们使用$shm_id来记录。 而$key是我们逻辑上代表共享显存段的Key值。 不同的进程只要选择相同的Keyid就可以共享同一个存储段。 我们习惯使用字符串(类似于文件名)的哈希值作为 keyid。 $mode表示共享显存段的使用方式。 在这里,因为它是新创建的,所以值为“c”——这意味着创建。 如果您访问的是已经完善的共享显存,请使用'a',--表示访问。 $perm参数定义访问权限,8补码,权限定义请参考UNIX文件系统帮助。 $size 定义共享视频内存的大小。 虽然它有点像fopen(文件处理),但您不应该将其视为与文件处理相同。 在描述旁边您会看到一些内容。

例如:

$shm_id=shmop_open(0xff3,"c",0644,100);

这里我们打开一个共享内存段通配符0xff3-rw-rr-格式,大小为100字节。

如果需要访问现有的共享内存段,则必须在调用 shmop_open 时将第三个和第四个参数设置为 0。

查询IPC工作状态

在Unix下,可以使用命令行程序ipcs来查询系统中所有IPC资源的状态。 但是,某些系统要求需要超级用户才能执行。 右图是一段ipcs运行结果。

上图中,系统显示了4个共享显存段。 请注意php 共享内存,名为 0xx0000000000ffff3 的第四个键是由我们刚刚运行的 PHP 程序创建的。 有关 ipcs 的使用信息,请参阅 UNIX 用户指南。

如何释放共享显存

释放共享显存的方法是调用PHP命令:shmop_delete($id)

shmop_delete($id);

$id是调用shmop_open时保存的shmop_op的返回值。 另一种方法是使用 UNIX 管理命令:

ipcrmid,id 是您使用 ipcs 听到的 ID。 它与您程序中的 $id 不同。 但要小心,如果使用 ipcrm 直接删除共享显存段,可能会导致其他不知情的进程在引用这个早已消失的共享显存时犯一些不可预知的错误(往往会产生不好的结果)。

如何使用(读写)共享显存

使用如下所示的函数将数据写入共享显存

intshmop_write(intshmid,字符串数据,intoffset)

其中 shmid 是 shmop_open 返回的句柄。 $Data 变量存储要存储的数据。 $offset描述了从共享内存的开头(从0开始)写入第一个字节的位置。

操作是:

stringshmop_read(intshmid,intstart,intcount)

同样,指定 $shmid、起始倾斜量(从 0 开始)和读取总数。 返回结果字符串。 这样,你就可以把共享内存段看成是一个字节链表。 读几本,写几本,随心所欲。 非常方便。

多进程问题的考虑

如今,您在单个 PHP 进程中读取、写入、创建和删除共享视频内存应该没有问题。 而且,即使实际操作中不可能,也只有一个PHP进程在运行。 如果在多进程的情况下仍然遵循单进程的处理方法,肯定会遇到问题——众所周知的并行和互斥问题。 例如,有两个进程需要同时读写同一段显存。 当两个进程同时执行写操作时,会得到一个错误的数据,因为显存的该段可能是最后执行的进程的内容,甚至是两个进程写入的数据的随机混合,有四种不同的情况:图片。 这实际上是不可接受的。 为了解决这个问题,我们必须引入互斥机制。 互斥机制在很多操作系统教材中都有具体介绍,这里不再赘述。 实现互斥机制最简单的方法是使用信号量。 信号量是进程间通信 (IPC) 的另一种形式,与其他 IPC 机制(管道、FIFO、消息队列)不同。 它是一个计数器,用于控制多个进程共享数据的存储。 同样,可以使用ipcs和ipcrm来查询信号量的状态并删除它。 在 PHP 中,您可以使用以下函数创建一个新信号量并返回该信号量的句柄。 如果key指向的信号量已经存在,则sem_get直接返回操作该信号量的句柄。

intsem_get(intkey[,intmax_acquire[,intperm]])

$max_acquire 指定在不等待信号释放的情况下可以有多少个进程同时进入该信号(即同时处理某个资源的最大进程数,通常该值为1)。 $perm 指定访问权限。

一旦你成功占有了一个信号量,你只能用它做两件事:请求和释放。 当您执行释放操作时,系统会将信号值减一。 如果大于0,也设置为0。当执行请求操作时,系统会将信号值加1。 如果该值小于设定的最大值,系统将暂停你的处理进程,直到释放其他进程大于该最大值。 通常最大值设置为1,这样当一个进程收到请求时,其他相邻进程只能等待它退出互斥体并释放信号量进入互斥体,同时将其设置为独占模式。 这种信号量通常称为二态信号量。 事实上,如果年率是任何负数,则表明有多少共享资源单元可供共享应用程序使用。

申请和发布操作的PHP格式如下:

intsem_acquire(intsem_identifier) ​​应用程序

intsem_release(intsem_identifier) ​​释放

其中sem_identifier是调用sem_get的返回值(句柄)。

互斥合约的一个简单反例

下面是一个非常简单的互斥过程。

$semid=sem_get(0xee3,1,0666);

$shm_id=shmop_open(0xff3,"c",0644,100);

sem_acquire($semid);//申请

这里对共享显存进行处理

sem_release($semid);//释放

正如你所看到的,互斥的实现很简单:应用程序进入临界区php 共享内存,对临界区的资源进行操作(例如更改共享显存),退出临界区并释放信号。 这保证了两个进程不可能在同一时间片对同一段共享显存进行操作。 由于信号量机制保证一个时间片只能被一个进程踏入,所以其他进程必须等待当前处理的进程完成后才能踏入。

临界区通常是指不允许多个进程同时并发处理的这些代码段。

需要注意的是,在PHP中它所占用的信号量必须由同一个进程释放。 在正常的系统中,一个进程是可以释放其他进程占用的信号的。 编译临界区代码时,必须仔细设计资源分配,防止出现A等待B、B等待A的死锁情况。

使用

IPC的应用非常广泛。 例如,在不同进程之间保存解释后的复杂配置文件,或特定的用户设置等,以防止重复处理。 我还利用共享显存技术,将大量PHP脚本必须引用的大文件加载到共享显存中,显着提高了Web服务的速度,消除了一些困难。 关于它的用途,有聊天室、组播等,IPC的威力就看你想象力的大小了。 如果这篇文章对您有一点启发,我将感到荣幸。 我很乐意与您讨论这项令人着迷的笔记本电脑技术。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php 共享内存-PHP共享显存 https://www.wkzy.net/game/185245.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务