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+Html+缓存
Nov 25 PHP
php面向对象全攻略 (十六) 对象的串行化
Sep 30 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
PHP CLI模式下的多进程应用分析
Jun 03 PHP
php cli换行示例
Apr 22 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
Jan 26 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
yii2 resetful 授权验证详解
May 18 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
Laravel核心解读之异常处理的实践过程
Feb 24 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
又一个PHP实现的冒泡排序算法分享
2014/08/21 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
JSON格式化输出
2014/11/10 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
pyqt和pyside开发图形化界面
2014/01/22 Python
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python字符串中查找子串小技巧
2015/04/10 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
python实现简易淘宝购物
2019/11/22 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
产假请假条
2014/04/10 职场文书
老兵退伍感言
2015/08/03 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
在Python中如何使用yield
2021/06/07 Python
浅谈MySQL函数
2021/10/05 MySQL