准备

我们都知道PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEMON守护进程时,多进程的优势不用多说。

PHP的多线程也曾被人提及,但进程内多线程资源共享和分配的问题难以解决。PHP也有多线程想关的扩展 pthreads ,但据说不太稳定,且要求环境为线程安全,所用不多。

以前PHP群里的一位大神曾指导说后台PHP想进阶必然避不开多进程,正好公司里的守护进程也应用了PHP的多进程,结合着谷哥的各种资料和手册,总算理解了多进程,并自己写了一个小demo(在linux系统上实现的),用此文总结一下,如有错漏,谢谢提出。

要实现PHP的多进程,我们需要两个扩展 pcntl 和 posix,安装方法这里不再赘述。

在php中我们使用pcntl_fork()来创建多进程(在*NIX系统的C语言编程中,已有进程通过调用fork函数来产生新的进程)。fork出来新进程则成为子进程,原进程则成为父进程,子进程拥有父进程的副本。这里要注意:

"htmlcode">

$ppid = posix_getpid();

$pid = pcntl_fork();

if ($pid == -1) {

  throw new Exception('fork child process fail');

} elseif ($pid > 0) {

  cli_set_process_title("我是父 process,pid is : {$ppid}.");

  sleep(30);

} else {

  $cpid = posix_getpid();

  cli_set_process_title("我是 {$ppid} 子的 process,我的 process pid is : {$cpid}.");

  sleep(30);

}

说明:

posix_getpid():返回当前进程 id

cli_set_process_title('进程名称'):为当前进程取一个响亮的名字。

运行这个例子,我们便能看到当前两个PHP进程了。

www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ ps aux|grep -v grep |grep 我

www   18026 0.5 1.2 204068 25772 pts/0  S+  14:08  0:00 我是父 process,pid is : 18026.

www   18027 0.0 0.3 204068 6640 pts/0  S+  14:08  0:00 我 18026 子的 process,我的 process pid is : 18027. 

第一段代码,在程序从pcntl_fork()后父进程和子进程将各自继续往下执行代码:

$pid = pcntl_fork();

if( $pid > 0 ){

 echo "我是父亲".PHP_EOL;

} else if( 0 == $pid ) {

 echo "我是儿子".PHP_EOL;

} else {

 echo "fork失败".PHP_EOL;

} 

结果:

www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ php 123.php

我是父亲

我是儿子

第二段代码,用来说明子进程拥有父进程的数据副本,而并不是共享:

// 初始化一个 number变量 数值为1

$number = 1;

$pid = pcntl_fork();

if ($pid > 0) {

  $number += 1;

  echo "我是父亲,number+1 : { $number }" . PHP_EOL;

} else if (0 == $pid) {

  $number += 2;

  echo "我是儿子,number+2 : { $number }" . PHP_EOL;

} else {

  echo "fork失败" . PHP_EOL;

}

结果

www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ php 1234.php

我是父亲,number+1 : { 2 }

我是儿子,number+2 : { 3 }

标签:
PHP7,多进程

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
桃源资源网 Design By www.nqtax.com

评论“浅析PHP7的多进程及实例源码”

暂无“浅析PHP7的多进程及实例源码”评论...