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 压缩文件夹的类代码
Nov 05 PHP
php url路由入门实例
Apr 23 PHP
一个简单的PHP验证码实现代码
May 10 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
分享最受欢迎的5款PHP框架
Nov 27 PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 PHP
PHP实现读取文件夹及批量重命名文件操作示例
Apr 15 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实现singleton()单例模式实例
2014/11/06 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
什么时候用assert
2015/05/08 面试题
高中生的学习总结自我鉴定
2013/10/26 职场文书
组工干部演讲稿
2014/09/02 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
先进个人评语大全
2015/01/04 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript