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 相关文章推荐
一个没有MYSQL数据库支持的简易留言本的编写
Oct 09 PHP
15种PHP Encoder的比较
Mar 06 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
Jul 01 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
Dec 15 PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 PHP
PHP生成plist数据的方法
Jun 16 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 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 array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
web打印小结
2017/01/11 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
vue debug 二种方法
2018/09/16 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
Python算法应用实战之栈详解
2017/02/04 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
python计算列表内各元素的个数实例
2018/06/29 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
Python中函数的返回值示例浅析
2019/08/28 Python
杭州时比特电子有限公司SQL
2013/08/22 面试题
草船借箭教学反思
2014/02/03 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书