PHP基于进程控制函数实现多线程


Posted in PHP onDecember 09, 2020

php有一组进程控制函数(编译时需要?enable-pcntl与posix扩展),使得php能在nginx系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。

CentOS 6 下yum安装php的,默认是不安装pcntl的,因此需要单独编译安装,首先下载对应版本的php,解压后

cd php-version/ext/pcntl 
phpize 
./configure && make && make install 
cp /usr/lib/php/modules/pcntl.so /usr/lib64/php/modules/pcntl.so 
echo "extension=pcntl.so" >> /etc/php.ini 
/etc/init.d/httpd restart

方便极了。

下面是示例代码:

<?php 
header('content-type:text/html;charset=utf-8' ); 
 
// 必须加载扩展 
if (!function_exists("pcntl_fork")) { 
  die("pcntl extention is must !"); 
} 
//总进程的数量 
$totals = 3; 
// 执行的脚本数量 
$cmdArr = array(); 
// 执行的脚本数量的数组 
for ($i = 0; $i < $totals; $i++) { 
  $cmdArr[] = array("path" => __DIR__ . "/run.php", 'pid' =>$i ,'total' =>$totals); 
} 
 
/* 
展开:$cmdArr 
Array 
( 
  [0] => Array 
    ( 
      [path] => /var/www/html/company/pcntl/run.php 
      [pid] => 0 
      [total] => 3 
    ) 
 
  [1] => Array 
    ( 
      [path] => /var/www/html/company/pcntl/run.php 
      [pid] => 1 
      [total] => 3 
    ) 
 
  [2] => Array 
    ( 
      [path] => /var/www/html/company/pcntl/run.php 
      [pid] => 2 
      [total] => 3 
    ) 
 
) 
*/ 
 
pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。 
foreach ($cmdArr as  $cmd) { 
  $pid = pcntl_fork();  //创建子进程 
  //父进程和子进程都会执行下面代码 
  if ($pid == -1) { 
    //错误处理:创建子进程失败时返回-1. 
    die('could not fork'); 
  } else if ($pid) { 
    //父进程会得到子进程号,所以这里是父进程执行的逻辑 
    //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成: 
    pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。 
  } else { 
    //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 
    $path  = $cmd["path"]; 
    $pid = $cmd['pid'] ; 
    $total = $cmd['total'] ; 
    echo exec("/usr/bin/php {$path} {$pid} {$total}")."\n"; 
    exit(0) ; 
  } 
} 
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
如何利用php+mysql保存和输出文件
Oct 09 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
YII路径的用法总结
Jul 09 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
php header函数的常用http头设置
Jun 25 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 PHP
PHP读取大文件的几种方法介绍
Oct 27 PHP
PHP数组生成XML格式数据的封装类实例
Nov 10 PHP
PHP利用二叉堆实现TopK-算法的方法详解
Apr 24 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 PHP
phpStudy vscode 搭建debug调试的教程详解
Jul 28 PHP
PHP控制循环操作的时间
Apr 01 PHP
PHP如何防止用户重复提交表单
Dec 09 #PHP
Nginx+php配置文件及原理解析
Dec 09 #PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 #PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 #PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 #PHP
PHP大文件分割分片上传实现代码
Dec 09 #PHP
PHP rsa加密解密算法原理解析
Dec 09 #PHP
You might like
特转载一高手总结PHP学习资源和链接.
2006/12/05 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
php生成随机颜色方法汇总
2014/12/03 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
Javascript的闭包
2009/12/31 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
JS动态图片的实现方法完整示例
2020/01/13 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
蔻驰美国官网:COACH美国
2016/08/18 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
易程科技软件测试笔试
2013/03/24 面试题
升职自荐信范文
2013/10/05 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
Python数据分析之pandas读取数据
2021/06/02 Python
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
Nginx反向代理、重定向
2022/04/13 Servers
数据设计之权限的实现
2022/08/05 MySQL