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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
其他功能
Oct 09 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
Apr 25 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
初步介绍PHP扩展开发经验分享
Sep 06 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
destoon调用discuz论坛中带图片帖子的实现方法
Aug 21 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
PHP实现动态web服务器方法
Jul 29 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
PHP5.6新增加的可变函数参数用法分析
Aug 25 PHP
PHP大文件分割分片上传实现代码
Dec 09 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
基于mysql的bbs设计(二)
2006/10/09 PHP
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
python备份文件的脚本
2008/08/11 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python如何调用外部系统命令
2019/08/07 Python
python统计字符的个数代码实例
2020/02/07 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
Python pip使用超时问题解决方案
2020/08/03 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
酒店开业庆典主持词
2014/03/21 职场文书
大学生励志演讲稿
2014/04/25 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书