首页 > 系统相关 >php 多进程编程

php 多进程编程

时间:2023-03-05 17:02:57浏览次数:53  
标签:fork EOL 编程 pid echo 进程 pcntl 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,子进程返回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泛滥

<?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服务器环境下,会出现无法预期的结果,请慎用!


标签:fork,EOL,编程,pid,echo,进程,pcntl,php
From: https://blog.51cto.com/sdwml/6101540

相关文章

  • ajax 返回值方法(php)
    <?phpfunctionmsg_error($state,$msg){if(!empty($_REQUEST['callback'])){$callback=$_REQUEST['callback'];$callback=preg_replace(array('......
  • php 正则表达式匹配(输出是否匹配以及匹配值) preg_match
    preg_match—执行一个正则表达式匹配preg_match($pattern,$subject,$matches)搜索subject与pattern给定的正则表达式的一个匹配.参数:pattern:要搜索的模式,字符......
  • nginx日志过滤php脚本
    <?php/***nginx日志过滤脚本*/$file='access.log';$access1='./access1.log';$access2='./access2.log';$access3='./access3.log';$access4='./access4.log';......
  • Python网络编程server端和client端代码
    #client端代码importsocketclient=socket.socket()client.connect(('127.0.0.1',3999))whileTrue:content=input('>>>')client.send(bytes(content,'ut......
  • php基本语法和数据类型、变量销毁
    1、PHP基本语法:HTML和php混合使用;一个语句以;(分号)结束;如何定义一个变量,和变量的使用;php中定义一个变量要以$符号开头:$a=34;变量的数据类型不是固定不变的,根据赋值的变化而......
  • PHPmyadmin与php的整合教程
    PHPmyadmin与php的整合教程:1、下载PHPmyadmin包2、解压PHPmyadmin包到Apache的htdocs目录下3、将PHP安装目录下的php.ini文件中的extension=php_mbstring.dll 前面分号去掉......
  • PHP与Apache整合教程
    1、安装Apache2、下载PHP包,解压到某文件夹。注意:PHP包不需安装,解压即可,注意Windows下安装的PHP包内部一定包含php5apache2_4.dll文件,若没有说明下载错误,重新查找下载。3、PH......
  • C语言学习笔记之 第四讲:C语言Windows命令行编程
    1、stdlib头文件即standardlibrary标准库头文件。stdlib头文件里包含了C、C++语言的最常用的​​系统函数​​该文件包含了C语言标准​​库函数​​的定义2、system()......
  • php脚本守护进程设计
    思路:while循环,若当前没有数据要操作可以休眠;crontab脚本每隔固定时间段执行该脚本,执行时先检测是否已在执行,若无执行,有则跳过。nohup后台执行flock-xn加锁2>&1表......
  • php 检测mysql表是否存在
    pdo:<?php$dsn='mysql:dbname=test;host=127.0.0.1';$user='root';$password='';try{$pdo=newPDO($dsn,$user,$password);}catch(PDOException$e){......