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来检测proxy
Oct 09 PHP
php minixml详解
Jul 19 PHP
PHP 时间转换Unix时间戳代码
Jan 22 PHP
php判断是否为json格式的方法
Mar 04 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
为PHP5.4开启Zend OPCode缓存
Dec 26 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
8个必备的PHP功能开发
Oct 02 PHP
php实现搜索类封装示例
Mar 31 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
Mar 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
php 传值赋值与引用赋值的区别
2010/12/29 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
总结js函数相关知识点
2018/02/27 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
js实现圆形菜单选择器
2020/12/03 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
实例讲解Python爬取网页数据
2018/07/08 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
python实现的config文件读写功能示例
2019/09/24 Python
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
大学生期末自我鉴定
2014/02/01 职场文书
开展读书活动总结
2014/06/30 职场文书
委托书的写法
2014/09/16 职场文书
出生公证书
2015/01/23 职场文书
运动会广播稿300字
2015/08/19 职场文书
python实现三次密码验证的示例
2021/04/29 Python