PHP网页设计在PHP中完成历程间通信
通过这段时间的学习实践,对软件开发有了更多新的认识,不在局限于之前的片面性。当然,现在所学到的东西其实并不多,离当一个真正的程序员,还有很大的差距。 本文将会商在PHP4情况下若何利用历程间通信机制――IPC(Inter-Process-Communication)。本文会商的软件情况是linux+php4.0.4或更高版本。起首,咱们假定你已装好了PHP4和UNIX, 为了使得php4可使用同享内存和旌旗灯号量,必需在编译php4法式时激活shmop和sysvsem这两个扩大模块。完成办法:在PHP设定(configure)时到场以下选项。
--enable-shmop --enable-sysvsem
如许就使得你的PHP体系可以处置相干的IPC函数了。
IPC是甚么?
IPC (Inter-process communication) 是一个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值。分歧历程只需选择统一个Key id就能够同享统一段存储段。习气上咱们用一个串(相似文件名一样的器材)的散列值作为key id. $mode指了然同享内存段的利用体例。这里因为是新建,因而值为’c’ C取create之意。假如你是会见已创立过的同享内存那末请用’a’,-- 取access之意。$perm参数界说了会见的权限,8进制,关于权限制义请看UNIX文件体系匡助。$size界说了同享内存的巨细。虽然有点象fopen(文件处置)你可不要当它同文件处置一样。前面的描写你将看到着一点。
例如:
$shm_id = shmop_open(0xff3, "c", 0644, 100);
这里咱们翻开了一个同享内存段 键值0xff3 Crw-r―r―格局,巨细为100字节。
假如需求会见已有的同享内存段,你必需在挪用shmop_open中设第3、4个参数为0。
IPC任务形态的查询
在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,如许一来当一个历程取得恳求时其他前面的历程只能守候它加入互斥区后释放旌旗灯号量才干进入该互斥区并同时设为独有体例。如许的旌旗灯号量常称为双态旌旗灯号量。固然,假如初值是恣意一个负数就标明有几何个同享资本单元可供同享使用。
请求、释放操作的PHP格局以下:
int sem_acquire (int sem_identifier) 请求
int sem_release (int sem_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); //释放
正如你所看到的,互斥的完成很复杂:请求进入临界区,对临界区资本停止操作(好比修正同享内存)加入临界区并释放旌旗灯号。如许一来就能够包管在统一个工夫片中不成能有同时2个历程对统一段同享内存停止操作。由于旌旗灯号量机制包管一个工夫片只能由一个历程进入,其他历程必需守候以后处置的历程完成前方能进入。
临界区通常为指那些不答应同时有多个历程并发处置的代码段。
要注重的是:在PHP中必需由统一个历程释放它所占用的旌旗灯号量。在普通体系中答应历程释放其余历程占用的旌旗灯号。在编写临界区代码必定要当心设计资本的分派,防止A等B,B等A的逝世锁情形产生。
应用
IPC的应用是非常普遍的。好比,在分歧历程间保留一个注释过的庞杂的设置装备摆设文件、或详细设置的用户等,以免反复处置。我也已经用同享内存的手艺把一多量PHP剧本必需援用的一个很大的文件放入同享内存,并由此明显提拔了Web办事的速度、消弭了局部瓶颈。关于它的利用还有聊天室,多路播送等等。IPC的威力取决于你的想象力的巨细。假如本文对你有一点点启示,那我不堪侥幸。情愿很你会商这使人出神的电脑手艺。Email: qwyaxm@163.net
接触MYSQL,开始设计数据库程序 先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。 做为1门年轻的语言,php一直很努力。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域, 再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 基础有没有对学习php没有太大区别,关键是兴趣。 Ps:以上纯属原创,如有雷同,纯属巧合 曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ; 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。 兴趣是最好的老师,百度是最好的词典。 使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
页:
[1]