PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

PHP实现多进程编程的方法

墨辰丷
墨辰丷 原创
2018-05-19 10:56:48 1281浏览

这篇文章主要介绍了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 — 返回导致子进程中断的信号

实例一:

<?php
//最早的进程,也是父进程
$parentPid = getmypid();
echo &#39;原始父进程:&#39; . $parentPid . PHP_EOL;
//创建子进程,返回子进程id
$pid = pcntl_fork();
if( $pid == -1 ){
  exit("fork error");
}
//pcntl_fork 后,父进程返回子进程id,子进程返回0
echo &#39;ID : &#39; . $pid . PHP_EOL;
if( $pid == 0 ){
  //子进程执行pcntl_fork的时候,pid总是0,并且不会再fork出新的进程
  $mypid = getmypid(); // 用getmypid()函数获取当前进程的PID
  echo &#39;I am child process. My PID is &#39; . $mypid . &#39; and my fathers PID is &#39; . $parentPid . PHP_EOL;
} else {
  //父进程fork之后,返回的就是子进程的pid号,pid不为0
  echo &#39;Oh my god! I am a father now! My childs PID is &#39; . $pid . &#39; and mine is &#39; . $parentPid . PHP_EOL;
}
$aa = shell_exec("ps -af | grep index.php");
echo $aa;

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

<?php
//最早的进程,也是父进程
$parentPid = getmypid();
echo &#39;原始父进程:&#39; . $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 &#39;子进程:&#39; . getmypid() . PHP_EOL;
    exit(); //子进程逻辑执行完后,马上退出,以免往下走再fork子进程,不好控制  
  } else {
    echo &#39;父进程:&#39; . 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实现多进程和多线程

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。