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 相关文章推荐
PHP5中新增stdClass 内部保留类
Jun 13 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
Jun 13 PHP
ThinkPHP实现一键清除缓存方法
Jun 26 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
PHP文件缓存类实现代码
Oct 26 PHP
PHP会员找回密码功能的简单实现
Sep 05 PHP
Yii框架分页实现方法详解
May 20 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
php实现的表单验证类完整示例
Aug 13 PHP
PHP array_reverse() 函数原理及实例解析
Jul 14 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内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
PHP生成唯一订单号的方法汇总
2015/04/16 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
js相册效果代码(点击创建即可)
2013/04/16 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python基础练习之几个简单的游戏
2017/11/10 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
无传销社区工作方案
2014/05/13 职场文书
毕业生求职信
2014/06/10 职场文书
五五普法心得体会
2014/09/04 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
招标保密承诺书
2015/01/20 职场文书
创业计划书之面包店
2019/09/17 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript