PHP多进程系列笔记(一)

本系列文章将向大家讲解 系列函数,从而更深入的理解进程相关知识。

PCNTL在PHP中进程控制支持默认是关闭的。您需要使用 配置选项重新编译PHP的 CGI或CLI版本以打开进程控制支持。

Note: 此扩展在 Windows 平台上不可用。

pcntl_fork

用于创建子进程。成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。

fork.php

命令行运行:

该例里父进程还没有来得及等子进程运行完毕就自动退出了,子进程由 进程接管。通过 看到子进程还在运行:

子进程成为孤立进程,ppid(父进程id)变成1了。如果在父进程里也加个 ,你会看到子进程ppid本来是大于1的,后来就变成1了。

注:如果是docker环境,孤立进程的ppid可能是0。

pcntl_wait

函数用来让父进程等待子进程退出,默认情况下会阻塞主进程。

阻塞模式

紧接着上面的例子,如果想等子进程运行结束后父进程再退出,该怎么办?那就用到 了。

该函数阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。

我们修改代码:

此时再次运行程序,父进程就会一直等待子进程运行结束然后退出。

和 功能相同。前者第一个参数支持指定pid参数,当指定-1作为 的值等同于后者。

当已知子进程pid的时候,可以使用 。

这两个函数返回退出的子进程进程号(>1),发生错误时返回-1,如果提供了 作为option(wait3可用的系统)并且没有可用子进程时返回0。

返回值为退出的子进程进程号时,想了解如何退出,可以通过 状态码反应。

非阻塞模式

默认情况下会阻塞主进程,直到子进程执行完毕才继续往下运行。如果设置最后一个参数为常量 ,那么就不会阻塞主进程,而是继续执行后续代码, 此时 就会返回0。

示例:

该示例里只有一个子进程,看不出来非阻塞的好处,我们修改一下:

处首先先去掉 参数,运行:

我们看到,6603号进程运行时间最短,但是是最后回收。我们再加上 参数,运行:

6697进程最先回收!说明确实是异步非阻塞的。感兴趣的朋友还可以开启 处代码,未使用 参数的时候,里面的代码是不会运行的。

注意: 处需要注意子进程需要exit,防止子进程也进入for循环。如果没有 ,最终创建的子进程不只3个。

检测status函数

在 和 两个函数中的 中存了子进程的状态信息,这个参数可以用于 、 、 、 、 、 、 这些函数。

代码片段:

参考

1、php多进程 防止出现僵尸进程

https://www.cnblogs.com/jkko123/p/6351615.html?utmsource=itdadao&utmmedium=referral

2、PCNTL函数族--PHP多进程编程 (转)

https://www.cnblogs.com/zox2011/archive/2013/02/19/2917448.html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180613G08R8B00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券