首页 > 编程 > PHP > 正文

PHP多进程编程实例详解

2019-11-21 20:56:16
字体:
来源:转载
供稿:网友

本文实例讲述了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 ― 返回导致子进程中断的信号

实例一:

<?php//最早的进程,也是父进程$parentPid = getmypid();echo '原始父进程:' . $parentPid . PHP_EOL;//创建子进程,返回子进程id$pid = pcntl_fork();if( $pid == -1 ){  exit("fork error");}//pcntl_fork 后,父进程返回子进程id,子进程返回0echo '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泛滥

<?php//最早的进程,也是父进程$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相关内容感兴趣的读者可查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表