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 相关文章推荐
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
Dec 24 PHP
PHP中使用正则表达式提取中文实现笔记
Jan 20 PHP
php在数组中查找指定值的方法
Mar 17 PHP
浅析iis7.5安装配置php环境
May 10 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
Yii2使用表单上传文件的实例代码
Aug 03 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 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集成FCK的函数代码
2008/09/27 PHP
php随机输出名人名言的代码
2012/10/07 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
2011/04/28 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
python测试驱动开发实例
2014/10/08 Python
Python用for循环实现九九乘法表
2018/05/31 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
python-numpy-指数分布实例详解
2019/12/07 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
使用Redis实现实时排行榜功能
2021/07/02 Redis