php多进程示例,PHP多进程编程实例详解

本文实例讲述了PHP多进程编程。分享给大家供大家参考,具体如下:

第一步:

$ php -m  命令查看php是否安装pcntl 和 posix扩展,若没有则安装

使用场景:

1. 要进行大量的网络耗时的操作

2. 要做大量的运算,并且,系统有多个cpu,为了让用户有更快的体验,把一个任务,分成几个小任务,最后合并。

多进程常用函数:

pcntl_alarm — 为进程设置一个alarm闹钟信号

pcntl_errno— 别名 pcntl_strerror

pcntl_exec— 在当前进程空间执行指定程序

pcntl_fork — 创建子进程,在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。

pcntl_get_last_error — Retrieve the error number set by the last pcntl function which failed

pcntl_getpriority — 获取任意进程的优先级

pcntl_setpriority — 修改任意进程的优先级

pcntl_signal_dispatch — 调用等待信号的处理器

pcntl_signal — 安装一个信号处理器

pcntl_sigprocmask — 设置或检索阻塞信号

pcntl_sigtimedwait — 带超时机制的信号等待

pcntl_sigwaitinfo — 等待信号

pcntl_strerror— Retrieve the system error message associated with the given errno

pcntl_wait — 等待或返回fork的子进程状态

pcntl_waitpid — 等待或返回fork的子进程状态

pcntl_wexitstatus — 返回一个中断的子进程的返回代码

pcntl_wifexited — 检查状态代码是否代表一个正常的退出。

pcntl_wifsignaled — 检查子进程状态码是否代表由于某个信号而中断

pcntl_wifstopped — 检查子进程当前是否已经停止

pcntl_wstopsig — 返回导致子进程停止的信号

pcntl_wtermsig — 返回导致子进程中断的信号

实例一:

//最早的进程,也是父进程

$parentPid = getmypid();

echo '原始父进程:' . $parentPid . PHP_EOL;

//创建子进程,返回子进程id

$pid = pcntl_fork();

if( $pid == -1 ){

exit("fork error");

}

//pcntl_fork 后,父进程返回子进程id,子进程返回0

echo 'ID : ' . $pid . PHP_EOL;

if( $pid == 0 ){

//子进程执行pcntl_fork的时候,pid总是0,并且不会再fork出新的进程

$mypid = getmypid(); // 用getmypid()函数获取当前进程的PID

echo 'I am child process. My PID is ' . $mypid . ' and my fathers PID is ' . $parentPid . PHP_EOL;

} else {

//父进程fork之后,返回的就是子进程的pid号,pid不为0

echo 'Oh my god! I am a father now! My childs PID is ' . $pid . ' and mine is ' . $parentPid . PHP_EOL;

}

$aa = shell_exec("ps -af | grep index.php");

echo $aa;

实例二:开多个子进程,避免fork泛滥

//最早的进程,也是父进程

$parentPid = getmypid();

echo '原始父进程:' . $parentPid . PHP_EOL;

//开启十个子进程

for($i = 0; $i < 10; $i++) {

$pid = pcntl_fork();

if($pid == -1) {

echo "Could not fork!\n";

exit(1);

}

//子进程

if(!$pid) {

//child process workspace

echo '子进程:' . getmypid() . PHP_EOL;

exit(); //子进程逻辑执行完后,马上退出,以免往下走再fork子进程,不好控制

} else {

echo '父进程:' . getmypid() . PHP_EOL;

}

}

echo getmypid() . PHP_EOL;

$aa = shell_exec("ps -af | grep index.php");

echo $aa;

注意:

通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器环境下,会出现无法预期的结果,请慎用!

希望本文所述对大家PHP程序设计有所帮助。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值