PHP多进程编程摘要(推荐)

PHP多进程编程摘要(推荐)
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多进程编程总结(推荐)是分享的全部内容,小编的,希望能给大家一个参考,我希望你能支持它。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部