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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
基于Windows下Apache PHP5.3.1安装教程
Jan 08 PHP
window+nginx+php环境配置 附配置搭配说明
Dec 29 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
解析php中var_dump,var_export,print_r三个函数的区别
Jun 21 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
Dec 03 PHP
php中spl_autoload详解
Oct 17 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
由php中字符offset特征造成的绕过漏洞详解
Jul 07 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
js实现随机点名小功能
2017/08/17 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
Python实现Linux中的du命令
2017/06/12 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
tensorflow更改变量的值实例
2018/07/30 Python
python画微信表情符的实例代码
2019/10/09 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
优秀求职自荐信怎样写
2013/12/18 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
软件测试专业推荐信
2014/09/18 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android