仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1248|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网页设计PHP中完成历程间通信

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
小试一下身手,大概是没问题了,那么交给你个任务,做个留言本吧,这和HELLO WORLD有一比啊!^_^,同是新手面临的第一道关。历程   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入手下手)、总读取数目。前往了局串。如许,你就能够把同享内存段看成是一个字节数组。读几个再写几个,想干吗就干吗,非常便利。
多历程成绩的思索
如今,在独自的一玫揭桓龃砦蟮氖荩蛭枚文诖娼赡苁亲詈笾葱械慕痰哪谌荩踔潦怯?个历程写入的数据轮番随机呈现的一段夹杂的四不象。这明显是不克不及承受的。为懂得决这个成绩,咱们必需引入互斥机制。互斥机制在良多操作体系的教材上都有专门讲述,这里不多反复。完成互斥机制的最复杂举措就是利用旌旗灯号灯。旌旗灯号量是别的一种历程间通信(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
  如果你单纯是为了做网站赚钱,我想你还是别学php的好,去学ASP,JSP好了,毕竟它们有实力雄厚的公司去支持它们。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-2-4 10:30:10 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
再见西城 该用户已被删除
板凳
发表于 2015-2-6 14:49:10 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
变相怪杰 该用户已被删除
地板
发表于 2015-2-14 15:57:21 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
金色的骷髅 该用户已被删除
5#
发表于 2015-2-20 07:49:16 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
山那边是海 该用户已被删除
6#
发表于 2015-3-4 04:16:14 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
第二个灵魂 该用户已被删除
7#
发表于 2015-3-11 16:27:39 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
柔情似水 该用户已被删除
8#
发表于 2015-3-11 21:07:07 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
只想知道 该用户已被删除
9#
发表于 2015-3-15 22:25:59 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
老尸 该用户已被删除
10#
发表于 2015-3-17 18:33:21 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
小女巫 该用户已被删除
11#
发表于 2015-3-24 18:50:12 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
谁可相欹 该用户已被删除
12#
发表于 2015-3-26 03:03:29 | 只看该作者
爱上php,他也会爱上你。
爱飞 该用户已被删除
13#
发表于 2015-3-29 05:24:32 | 只看该作者
爱上php,他也会爱上你。
再现理想 该用户已被删除
14#
发表于 2015-4-6 00:10:52 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
透明 该用户已被删除
15#
发表于 2015-4-12 19:47:42 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
小魔女 该用户已被删除
16#
 楼主| 发表于 2015-4-26 07:56:06 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
愤怒的大鸟 该用户已被删除
17#
发表于 2015-6-12 16:53:44 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
蒙在股里 该用户已被删除
18#
发表于 2015-6-12 19:32:51 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
海妖 该用户已被删除
19#
发表于 2015-6-24 12:04:08 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-18 02:16

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表