当前位置:  编程技术>php

单台服务器的PHP进程之间实现共享内存的方法

    来源: 互联网  发布时间:2014-08-26

    本文导语:  开发人员要想使php进程实现共享内存的读写,首先就要支持IPC函数,即php编译安装时指定:--enable-shmop  与--enable-sysvsem 两个选项。 IPC (Inter-process communication) 是一个Unix标准机制,它提供了使得在同一台主机不同进程之间可以互...

开发人员要想使php进程实现共享内存的读写,首先就要支持IPC函数,即php编译安装时指定:--enable-shmop  与--enable-sysvsem 两个选项。

IPC (Inter-process communication) 是一个Unix标准机制,它提供了使得在同一台主机不同进程之间可以互相的方法。基本的IPC处理机制有3种:它们分别是共享内存、信号量和消息队列。本文中我们主要讨论共享内存和信号量的使用。

在不同的处理进程之间使用共享内存是一个实现不同进程之间相互的好方法。如果你在一个进程中向所共享的内存写入一段信息,那么所有其他的进程也可以看到这段被写入的数据。非常方便。在PHP中有了共享内存的帮助,你可以实现不同进程在运行同一段PHP脚本时返回不同的结果。或实现对PHP同时运行数量的实时查询等等。

共享内存允许两个或者多个进程共享一给定的存储区。因为数据不需要在客户机和服务器之间复制,所以这是最快的一种IPC。使用共享内存的唯一窍门是多个进程对一给定存储区的同步存取。

如何建立一个共享内存段呢?下面的代码可以帮你建立共享内存。

代码如下:
$shm_id = shmop_open($key, $mode, $perm, $size);

注意,每个共享内存段都有一个唯一的ID, 在PHP中,shmop_open会把建立好的共享内存段的ID返回,这里我们用$shm_id记录它。而$key是一个我们逻辑上表示共享内存段的Key值。不同进程只要选择同一个Key id就可以共享同一段存储段。习惯上我们用一个串(类似文件名一样的东西)的散列值作为key id. $mode指明了共享内存段的使用方式。这里由于是新建,因此值为'c' –取create之意。如果你是已经建立过的共享内存那么请用'a', 取access之意。$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的返回值。还有一个办法就是用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进程在运行中。如果在多个进程的情况下你还是沿用单个进程的处理方法,你一定会碰到问题--著名的并行和互斥问题。比如说有2个进程同时需要对同一段内存进行读写。当两个进程同时执行写入操作时,你将得到一个错误的数据,因为该段内存将之可能是最后执行的进程的内容,甚至是由2个进程写入的数据轮流随机出现的一段混合的四不象。这显然是不能接受的。为了解决这个问题,我们必须引入互斥机制。互斥机制在很多操作系统的教材上都有专门讲述,这里不多重复。实现互斥机制的最简单办法就是使用信号灯。信号量是另外一种进程间(IPC)的方式,它同其他IPC机构(管道、FIFO、消息队列)不同。它是一个记数器,用于控制多进程对共享数据的存储。同样的是你可以用ipcs和ipcrm实现对信号灯使用状态的查询和对其实现删除操作。在PHP中你可以用下列函数创建一个新的信号量并返回操作该信号量的句柄。如果该key指向的信号量已经存在,sem_get直接返回操作该信号量的句柄。

代码如下:
int sem_get(int key [, int max_acquire [, int perm]])

$max_acquire 指明同时最多可以用几个进程进入该信号而不必等待该信号被释放(也就是最大同时处理某一资源的进程数目,一般该值均为一)。$perm指明了权限。

一旦你成功的拥有了一个信号量,你对它所能做的只有2种:请求、释放。当你执行释放操作时, 系统将把该信号值减一。如果小于0那就还设为0。而当你执行请求操作时,系统将把该信号值加一,如果该值大于设定的最大值那么系统将挂起你的处理进程直到其他进程释放到小于最大值为止。一般情况下最大值设为1,这样一来当一个进程获得请求时其他后面的进程只能等待它退出互斥区后释放信号量才能进入该互斥区并同时设为独占方式。这样的信号量常称为双态信号量。当然,如果初值是任意一个正数就表明有多少个共享资源单位可供共享应用。


    
 
 

您可能感兴趣的文章:

  • a 请问怎样查看服务器上的telnet进程,及远程telnet进程的ip
  • 服务器端的共享内存可否被远程客户端的进程所挂载使用?
  • 进程模型服务器的问题
  • unix下,多进程socket 服务器问题
  • 关于udp服务器 单进程
  • 我的linux服务器,cpu总是30-50%,top,ps出来的结果看不到哪个进程,怎么办?
  • fork 父进程动态刷新,子进程做操作反馈给服务器,不能实现,求指教
  • 客户端关闭,服务器进程也关闭?
  • 趋势的一道面试题:网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
  • 启动CVS服务器后,CVS的后台服务进程叫什么名?
  • 如何确定服务器的IO所属的进程?
  • 请问gprof命令对于多进程服务器的性能测试是否支持?
  • redhad linux9.0 的命令行中如何终止(杀死)一个服务器进程?
  • 通过JDBC连接数据库,执行抄作后,关闭了连接,数据服务器端的进程还在,怎麽处理?
  • linux系统使用python监控apache服务器进程脚本分享
  • 有谁知道redhat linux服务器可以给tomcat保留部分内存不被其他进程使用吗?
  • 很奇怪的问题:linux下tcp send导致服务器进程崩溃
  • 关于多进程sokcet服务器的一个问题
  • 急!急!能否用applet建立一个新的进程通过http协议访问服务器上的文件?
  • Tornado Web服务器多进程启动的2个方法
  • c/c++服务器程序内存泄露问题分析及解决
  • 我在hp服务器上装了个sco unixware7.1.3 但是内存是8G 但是我用命令查看内存
  • 服务器8G内存,怎样建立swap分区?
  • linux服务器 apache占用内存问题
  • 紧急求助:服务器内存的问题!!!
  • 恳请对服务器的开发有经验的谈谈服务器开发经验(Unix/Linux & Win32):服务器构架、内存泄漏检测,异常出错……!!!
  • IBM服务器 共享内存 D 代表什么!!
  • linux www服务器 负责不高,但是内存以耗尽 可能原因及解决办法
  • 客户端一个包发送到服务器端,一共要经过几次内存拷贝?
  • 大家在为linux服务器扩充内存的时候遇到过这样的问题吗?
  • 求救:linux 服务器,老是内存资源用尽,最后死机!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 两个邮件服务器之间是怎么转发邮件的呢
  • linux服务器之间如何实现时间同步?
  • 请教:两服务器之间的HTTP请求(非RMI实现)
  • 请问如何在两个web服务器之间实现通信?
  • 如何实现Unix/linux服务器之间文件的相互共享?
  • 两台不同城市的服务器之间要进行数据传输,请问具体的该怎么实现(红帽子)
  • Linux服务器之间的文件共享问题
  • 两台服务器之间怎么传送文件
  • EJB新手提问,同一服务器(就是同一容器吧)内EJB之间调用如何处理?
  • 向网络服务器发送数据的方法get()和post()之间的区别
  • 使用udp,客户端和服务器之间相互发送消息的例子
  • LINUX作为多台WIN98的服务器,WIN98之间可以映射目录吗
  • 重装服务器后IIS网站错误(应用程序中的服务器错误)
  • 请问在红旗Linux多功能服务器版上(不是数据库服务器版)能否正常安装使用Oracle?红旗Linux数据库服务器版要比红旗Linux多功能服务器版贵
  • nginx 服务器介绍
  • 校园网,www服务器,邮件服务器,数据库服务器等各用什么平台(系统)性能最佳?
  • 代理服务器原理,功能及作用详细介绍
  • 双linux服务器如何能在一台服务器崩溃的情况下在另一台服务器上启动相应服务
  • Apache HTTP服务器2.4中的新功能概览
  • 如何有效判断服务器已经连接不上(服务器关闭,服务器非法退出等原因)
  • php中操作memcache的类及成员列表及php下如何连接memched服务器
  • 在服务器端怎样检测客户端与服务器端的某个会话在一段时间里面没有通信,然后在服务器端终止该会话??
  • nginx服务器基本特性及使用技巧
  • 如果服务器不是本机(程序在一服务器,数据库在一服务器,局域网),如何连接sql ??
  • nginx服务器下通过fastcgi支持php5详细安装配置步骤
  • 采用sendmail搭建邮件服务器必须在邮件服务器上构建DNS服务吗?
  • Mysql服务器登陆,启动,停止等基本操作命令介绍(Linux/Centos环境)
  • web服务器和应用服务器的区别?
  • 服务器存储快照和数据库快照详解
  • 现在有50台服务器,他们的IP是192.168.1.1~192.168.1.100,如何将服务器192.168.1.1的/etc/rc.local快速复制到另外49台服务器上?
  • 如何去理解web服务器与应用服务器


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3