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创建动态图像
Oct 09 PHP
UCenter Home二次开发指南
May 28 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
推荐十款免费 WordPress 插件
Mar 24 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
php数据访问之增删改查操作
May 09 PHP
php使用文本统计访问量的方法
May 12 PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 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
source.php查看源文件
2006/12/09 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
python 快速排序代码
2009/11/23 Python
Python reduce()函数的用法小结
2017/11/15 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
竞选部长演讲稿
2014/04/26 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
2014年食堂工作总结
2014/11/20 职场文书
交警失职检讨书
2015/01/26 职场文书
百万英镑观后感
2015/06/09 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
Python基础之元组与文件知识总结
2021/05/19 Python
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技