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 syntax error, unexpected $end 错误的一种原因及解决
Oct 25 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
php HtmlReplace输入过滤安全函数
Jul 03 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
PHP 实现类似js中alert() 提示框
Mar 18 PHP
PHP判断IP并转跳到相应城市分站的方法
Mar 25 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
Laravel中的Blade模板引擎示例详解
Oct 10 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
Apr 08 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
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
Django的数据模型访问多对多键值的方法
2015/07/21 Python
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
python与字符编码问题
2019/05/24 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
python 从list中随机取值的方法
2020/11/16 Python
宝信软件JAVA工程师面试经历
2012/08/19 面试题
Linux Interview Questions For software testers
2012/06/02 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
标准导师推荐信(医学类)
2013/10/28 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
购房意向书
2014/04/01 职场文书
力学专业求职信
2014/07/23 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
2014年团支部工作总结
2014/11/17 职场文书
投标售后服务承诺书
2015/04/29 职场文书
上课迟到检讨书
2015/05/06 职场文书
大学团日活动总结书
2015/05/11 职场文书
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS
mysql全面解析json/数组
2022/07/07 MySQL