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 相关文章推荐
利用static实现表格的颜色隔行显示
Oct 09 PHP
php在线生成ico文件的代码
Oct 09 PHP
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
php生成局部唯一识别码LUID的代码
Oct 06 PHP
PHP操作Memcache实例介绍
Jun 14 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
Smarty模板配置实例简析
Jul 20 PHP
PHP实现本地图片转base64格式并上传
May 29 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/08/26 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
php接口隔离原则实例分析
2019/11/11 PHP
js 提交和设置表单的值
2008/12/19 Javascript
JavaScript 事件参考手册
2008/12/24 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
工作疏忽检讨书
2014/01/25 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
党校党性分析材料
2014/12/19 职场文书
人力资源部岗位职责
2015/02/11 职场文书
上下班时间调整通知
2015/04/23 职场文书
被委托人身份证明
2015/08/07 职场文书
禁毒主题班会教案
2015/08/14 职场文书
话题作文之自信作文
2019/11/15 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
redis cluster支持pipeline的实现思路
2021/06/23 Redis