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来写记数器(详细介绍)
Oct 09 PHP
模仿OSO的论坛(三)
Oct 09 PHP
怎样去阅读一份php源代码
Aug 21 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
May 11 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 PHP
PHP实现linux命令tail -f
Feb 22 PHP
thinkphp5使用无限极分类
Feb 18 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 PHP
php的无刷新操作实现方法分析
Feb 28 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文件缓存类示例分享
2015/01/30 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
python字典改变value值方法总结
2019/06/21 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
python爬虫 正则表达式解析
2019/09/28 Python
python实现简单图书管理系统
2019/11/22 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
Python LMDB库的使用示例
2021/02/14 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
医学生求职自荐信
2013/10/25 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
天气温馨提示语
2015/07/14 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技