解析PHP多进程编程

解析PHP多进程编程,第1张

概述解析PHP多进程编程

推荐:《PHP视频教程》

PHP多进程编程

@H_301_7@

使用多进程的优点:

    1. 使用多进程, 子进程结束以后, 内核会负责回收资源    2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.    3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.

PHP中实现多进程,Let's Go.

我们需要安装pcnt扩展

pcntl是process control的缩写,通常,PHP会默认安装这个扩展。使用PHPinfo()函数查看扩展是否存在。

使用pcntl_fork() 函数创建子进程

pcntl_fork作用就是创建和当前进程一样的子进程,这个子进程代码段和当前进程一模一样,但是拥有自己的数据段。看一个最简单的创建子进程的方法:

<?PHP/** *  hedong * @date 2017-04-03 */$parentPID = getmypID(); // 获取父进程ID $childPID = pcntl_fork(); // 创建子进程 switch($childPID) {    case -1:        print "创建子进程失败!".PHP_Eol;        exit;    case 0:        print "我是子进程,进程ID:{$childPID}".PHP_Eol;        break;    default:        print "我是父进程,进程ID:{$parentPID},子进程ID: {$childPID}".PHP_Eol;}?>
pcntl_fork()调用成功以后,一个程序变成了两个程序:一个程序得到的$pID变量值是0,它是子进程;另一个程序得到的$pID的值大于0,这个值是子进程的PID,它是父进程。

输出结果:

子进程回收

① 阻塞方式
刚刚有ps么?一般我习惯用ps aux加上grep命令来查找运行着的后台进程。其中有一列STAT,标识了每个进程的运行状态。这里,我们关注状态Z:僵尸(ZombIE)。当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程。僵尸进程虽然不占什么内存,但是很碍眼。(别忘了它们还占用着PID)

一般来说,在父进程结束之前回收挂掉的子进程就可以了。在pcntl扩展里面有一个pcntl_wait()函数,通过这个方法等待进程结束,然后回收已经结束的进程。

<?PHP/** *  hedong * @date 2017-04-03 */$parentPID = getmypID(); // 获取父进程ID $childPID = pcntl_fork(); // 创建子进程 switch($childPID) {    case -1:        print "创建子进程失败!".PHP_Eol;        exit;    case 0:        print "我是子进程,进程ID:{$childPID}".PHP_Eol;        break;    default:        pcntl_wait($status); // 子进程执行完后才执行父进程         print "我是父进程,进程ID:{$parentPID},子进程ID: {$childPID}".PHP_Eol;}

② 非阻塞方式
阻塞方式失去了多进程的并行性。还有一种方法,既可以回收已经结束的子进程,又可以并行。这就是非阻塞的方式。

<?PHP/** *  hedong * @date 2017-04-03 */for ($i = 1; $i <= 5; ++$i) {    $pID = pcntl_fork(); // 创建子进程    if (!$pID) {        sleep(1);        print "In child $i\n";        exit($i);    }}// pcntl_waitpID 第一个参数为 0 代表处理全部子进程while (pcntl_waitpID(0, $status) != -1) {    $status = pcntl_wexitstatus($status);    echo "Child $status completed\n";}

如果父进程先挂了怎么办?

会发生什么?什么也不会发生,子进程依旧还在运行。但是这个时候,子进程会被交给1号进程,1号进程成为了这些子进程的继父。1号进程会很好地处理这些进程的资源,当它们结束时1号进程会自动回收资源。所以,另一种处理僵尸进程的临时办法是关闭它们的父进程。

最后需要注意的:

进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 -- 摘自PHP手册

参考:

http://www.HackingwithPHP.com/16/1/3/getting-into-multiprocessinghttp://www.jb51.net/article/71232.htmhttp://www.laruence.com/2009/06/11/930.HTMLhttp://imhuchao.com/596.HTMLhttps://www.pureweber.com/article/PHP-multi-process-programming-prevIEw/
总结

以上是内存溢出为你收集整理的解析PHP多进程编程全部内容,希望文章能够帮你解决解析PHP多进程编程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1159827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存