1。准备
在你做之前,确保你没有使用微软Windows平台(因为我没有Windows)。Linux / Unix BSD /应该没事。
确认工作环境,看看所有的PHP模块,我们需要的是可用的。打开终端,
输入下面的
命令:
百万美元
这个命令
检查和
打印所有打开的
扩展当前的PHP是否pcntl和POSIX在输出列表。
1.1。pcntl
如果找不到pcntl 80%编译,扩展编写不。如果你是因为我已编译和
安装PHP一样,那么你需要重新编译和安装PHP。记住,使pcntl
参数配置时。
$ cd / / / php_source_code_dir
路径 美元。 /配置{一些其他
选项},使pcntl
制造安装
1.2。POSIX
货物一般
都是默认安装的,只要你不添加禁用POSIX --当你编译。
2。预备知识
在继续之前,您需要了解一点关于多
进程Linux的知识。多进程是如何实现的来自鸣人的影子有些不同。首先,这首歌是长的大,比如16岁,有一天他开始咳嗽,阴影和他分5。显然,这些尸体是16岁的老歌曲,而不是婴儿,只是不知道他们要哭泣(称为克隆)。然后是不同的:他们成为
独立的人,做自己的事情。他们不知道其他部位或身体在做什么,除非他们相互交流,才16岁才是他们的共同记忆。
有的同学说,老爸你不是坑爹吗我没见过鸣门!那你就去看看吧…
最后,对知识的准备,是对子过程的主要过程的一般理解,是一个子过程的代码和主进程完全相同的部分,并且所有的相同部分都是在阴影
启动之前
执行的,请参阅
操作系统课程。
三.影师
那么,如果没有一点基本知识,我们如何理解滚动的内容呢打开卷轴,首先看到一个词:叉。
3.1。叉
Fork叉分支,和一个更。这到底
是什么意思。此命令是用来
创建一个子进程,你需要使用pcntl_fork()
函数。(你可以在PHP手册中对这个
功能。
介绍一下)创建一个PHP
脚本:
$ PID =(pcntl_fork); / /如果调用成功,事情变得有点不同
如果($ = = 1){
模具('fork失败);
}如果($ = 0)
{人}
}
的pcntl_fork()函数创建子进程,和子进程,父进程的唯一
区别是,PID(进程ID)
不同于PPID(父进程ID)。在终端ps命令查看进程(问人怎么PS:男人时,PS)。函数返回一个值1,这表明叉失败。尝试添加在前面一句如果:echo $ PID。php_eol;
运行你的脚本,并输出可能如下(结果表明,子进程是父的代码相同)。
这是67789 #家长打印
这是0 #印刷工艺
该pcntl_fork成功后()函数的调用,子进程的PID是在父进程和子进程返回0。所以,我们使用if分支直接
控制父进程和子进程做不同的事情。
3.2。分配
任务 然后我们说,这首歌是16岁,我们分配两个简单的输出任务的原件和身体。
parentpid美元=(getmypid); / /这就是传说中的记忆在16岁之前
$ PID =(pcntl_fork); / /如果调用成功,事情变得有点不同
如果($ = = 1){
模具('fork失败);
}如果($ = 0)
mypid美元=(getmypid); / / getmypid()函数来获取当前进程的PID
echo'i是子进程。我的PID mypid美元。还有我父亲的。
{人}
echo'oh我D!我现在是父亲了!我孩子的PID。
}
输出可能是这样的结果:
哦,我的D!我现在是父亲了!我孩子的PID是68066。
我是孩子的过程。我的PID是68066,我父亲的PID是68065。
再次,当pcntl_fork()成功地调用,
程序就变成了两方案:$ PID变量值的一个项目是0,这是一个孩子的过程,并由另一个程序获得美元的PID值大于0,这是子进程的PID,和它的父进程。在下面的分支语句,不同的代码运行在$ PID值差异。再次,子进程的父进程的代码是一样的。因此有必要将不同的任务分配给他们的分支语句。
3.3。子进程回收
只是男人PS我用ps aux grep找到运行和后台进程的命令。有一列统计,确定每个过程的运行状态。在这里,我们专注于状态Z:僵尸。当孩子比父进程
退出,而不是父进程在任何
处理,子进程成为一个僵尸进程。哎呀,它不是在火的影子一样。鸣人的阴影消失后自动就干了,但子过程消失了,并且有了一个空壳,直到父进程
恢复。虽然僵尸过程中没有什么记忆,但它是难看的,院子里放着一堆僵尸怎么感觉怪怪的。(别忘了,他们仍然采取了PID)
在一般
情况下,有可能恢复,下跌之前,父进程结束的过程。在pcntl延伸有一个pcntl_wait()函数将父进程的子进程退出为止。如果一个子过程变成僵尸,它会立即返回,所有子进程都被回收,所以无论多少等等!
3.4。父进程挂起
如果父进程首先挂断怎么办会发生什么事没有什么可以发生,和子进程仍在运行,但在这个时候,子进程将交给1号和1号的过程,过程成为这些子的继父。1过程中会很好的处理这些过程的资源,当他们结束,1号过程自动回收资源。所以,另一个对付僵尸进程暂时的
方法是
关闭它们的父进程。
4。
信号 一般的多进程的事情结束了,但是信号确实是系统中非常重要的东西。信号是信号灯,信号灯是开着的,程序会响应。你必须使用这个,比如在终端下运行一个程序,它不响应半天。也许你会用Ctrl + D事实关闭程序,这是发送一个中断通过
键盘程序的信号:信号情报。有时这个过程失去响应并执行杀死{ }命令的PID。没有任何其他参数,程序将收到SIGTERM信号。当程序接收到上述信号,默认将结束执行,那么有可能改变这种默认行为必须能够!
4.1。
注册号
人是活的程序,活的,但程序需要遵循人所制定的规则,现在我们开始重新配置规则。你在这里使用的功能是pcntl_signal()(在去之前,为什么不检查PHP手册第一)。下面的程序将重新定义技术的行为。
/ /定义
处理器接收SIGINT信号输出一行信息
功能signalhandler($信号){
如果($信号= = SIGINT){
echo'signal收到。php_eol;
}
}
/ /信号登记:收到SIGINT信号时,呼叫signalhandler()函数
pcntl_signal(SIGINT,'signalhandler);
当(真){
睡眠(1);
做某事
(pcntl_signal_dispatch); / /接收信号,叫signalhandler(注册)
}
做它,并按Ctrl + C在任何时间,看看会发生什么事。
4.2。信号分配
这说明pcntl_signal()函数仅注册信号及其
处理方法。的pcntl_signal_dispatch()函数实际上是接收信号和呼叫处理方法。尝试 / /做一些
替换下面的代码:
($ i = 0;$ i < 1000000;$ + +){
我php_eol echo;
Usleep(100000);
}
在终端的末端执行这个脚本,当它不停下来输出数字时,试着按下Ctrl + C。程序的响应是什么嗯…没什么,除了
屏幕可能比^ C,该项目已出口数量不断。由于计划尚未执行pcntl_signal_dispatch(),signalhandler()不叫,所以没有输出信号接收。
4.3。版本问题
如果你看一下PHP
文件认真,你会
发现pcntl_signal_dispatch()函数是PHP 5.3或更多。如果PHP版本大于5.3,建议使用此方法调用信号处理器。低于5.3的版本需要在注册信号之前添加一个句子:声明(滴答=1);这意味着每次执行一个低级别指令时,它都会检查一个主信号。如果
检测到已注册的信号,则调用它的信号处理器。你为什么一直在检查最好在我们指定的地方办理登记手续。
4.4。体验僵尸进程
现在让我们回到子进程的恢复问题(差点忘了= =)。当你的子过程(或结束),在父进程仍在运行,不可能离开很长一段时间。僵尸进程是站起来!这时,伞
公司(内核)在其
网站上发现了一个僵尸。这个僵尸是谁的儿子只是看一看,你知道PPID。然后,内核发送信号给进程(PPID的僵尸进程的父进程):SIGCHLD。然后,你知道如何在父进程回收这孩子的过程吗一个
提示,使用pcntl_wait()函数。
4.5。发送信号
希望只需要通过kill命令一个严肃的人。事实上,它发送信号的过程中,和posix_kill()函数可以用PHP来达到相同的效果被称为。有了它,可以在父进程控制其他子过程的操作。例如,关闭所有子进程的父进程结束前,然后记录下所有子PID在父进程的过程时,叉完,然后发送端信号提前孩子的过程。
5。实践
PHP的多进程与C类似,理解用其他
语言编写的单词几乎是一样的。如果没有,试着写一个小程序,强烈地意识到自己的悲伤和喜悦:
这位1.16岁的歌手出了一个阴影,分为5个部分。
2。每一个物体随机地活10到30秒,每秒的输出量是多少
三.确保身体能够感觉到身体的末端,然后移动另一个身体,以确保有多达5个部分。
4。不要使用使用nohup,使原有的终端之后仍能运行关闭
5、将
组件(5)的数量划分为配置文件。当发送信号的原始体(可以考虑使用SIGUSR1和SIGUSR2),读取配置文件和更新个人的允许的最大数量。
6。如果身体更分开,关闭几个;如果它少,多一些。
提示:uff1a
1。使用while循环确保进程运行,请注意睡眠,以避免占用100%的CPU。
2。当运行过程的终端关闭,程序收到SIGHUP信号
三.你可以解析INI配置文件的parse_ini_file()函数
以上PHP多进程编程总结(
推荐)是
分享的全部内容,小编的,希望能给大家一个
参考,我希望你能
支持它。