linux php多进程编程,linux下php多进程编程

本文探讨了PHP在Web开发中的进程模型,介绍了在命令行环境下如何利用pcntl和posix扩展实现多进程处理,重点讲解了如何使用fork、setsid和信号处理创建守护进程,以及如何通过信号回调管理子进程数量。
摘要由CSDN通过智能技术生成

php在很多情况用在web开发中,通常情况下一次请求对应一个php进程,进程执行完返回数据销毁执行过程中的中间变量代码,在一些perfork类型的的sapi中,它又会等待下一个请求过来重新初始化执行环境、执行脚本,已经执行完成后的清理工作。但在如命令行下有时候一个进程满足不了需求,比如微博的异步发送,如果是用php脚本处理的话,脚本需要从发送队列中取数据,然后对数据进行处理,一个进程显然太慢,解决这种问题可以用php自带的popen、exect之类的函数,也可以用php多进程编程来解决。

php的多进程管理需要pcntl和posix扩展,在官方手册中:

POSIX functions are enabled by default. You can disable POSIX-like functions with --disable-posix 。

Process Control support in PHP is not enabled by default. You have to compile the CGI or CLI version of PHP with --enable-pcntl configuration option when compiling PHP to enable Process Control support.

因为posix协议是针对unix系的,window下就不考虑了。下面用这两个扩展中的函数写一个多进程的daemon进程。

$max = 6;

$current = 0;

pcntl_signal(SIGCHLD, "reduce_current");

/*

* signal callback function

*/

function reduce_current($signal)

{

global $current;

if ($signal === SIGCHLD) {

$current--;

}

}

// become a daemon

if (($pid = pcntl_fork()) === -1) {

die("fork error");

} elseif ($pid) {

exit;

} else {

if (posix_setsid() === -1)

die("setsid error");

if (($pid = pcntl_fork()) === -1)

die("fork error");

elseif($pid)

exit;

}

while(1) {

$current++;

if (($pid = pcntl_fork()) === -1) {

//log and exit

} elseif ($pid) {

//father process

if ($current >= $max ) {

//blocking

if(pcntl_wait($status) === -1) {

//log or exit

}

}

} else {

//child process

//do something repalce sleep

sleep(3);

exit;

}

}

代码中规定脚本最大可以fork出6个进程,但数据达到6个后,会调用pcntl_warit使父进程挂起。当子进程执行完自己的任务(此处以sleep 3 秒代替)后退出时,父进程通过 捕获子进程退出状态,通过pcntl_signal 注册的的回调函数使其子进程数量减1,然后又可以继续fork子进程。如图中,父进程通过两次fork变成一个daemon进程,其父进程id为1(即init进程),其6个子进程的ppid与它的pid一样,都是918。

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值