在php中实现多进程,一般有两种方法,一种是使用PHP自带的pcntl_*函数(仅限linux),另一种就是使用popen/proc_open,然后在php内部控制进程数量。

使用pcntl_*函数

PHP提供了一系列的pcntl_*函数,顾名思义就是process control functions,专门用来管理进程的。最常用的就是pcntl_fork和pcntl_wait。

pcntl_fork的作用就是从当前的进程再派生出一个子进程。pcntl_wait的作用是挂起当前进程,直到一个子进程中止。

例子:

复制代码 代码示例:

//配合pcntl_signal使用

declare(ticks=1);

//最大的子进程数量

$max = 5;

//当前的子进程数量

$child = 0;

//当子进程退出时,会触发该函数

function sig_handler($sig) {

global $child;

switch($sig) {

case SIGCHLD:

echo 'SIGCHLD received'."\n";

$child--;

}

}

//注册子进程退出时调用的函数

pcntl_signal(SIGCHLD, "sig_handler");

while(true) {

$child++;

/**

* 这个函数会返回两个值,一个为0,表示子进程;一个为正整数表示子进程的id

* 所以if和else里的两段代码都会执行

* if里的代码是父进程执行的

* else里的代码是子进程执行的

*/

$pid = pcntl_fork();

if ($pid) {

//这里是父进程执行的代码

//如果子进程数超过了最大值,则挂起父进程

//也就是说while语句不会继续执行

if ($child >= $max) {

pcntl_wait($status);

}

}

else {

//这里是子进程执行的代码

//如果要执行其他命令的话,使用pcntl_exec

echo "starting new child | now we have $child child process\n";

sleep(rand(3, 5));

exit;

}

}

?>

上面这段代码就是保证有5个子进程一直在干活,如果$child数量大于$max,就等子进程结束后再继续运行。子进程结束后会调用 sig_handler函数,sig_handler会将$child

数量减1,那边while继续执行。

使用popen/proc_open

popen会创建一个管道来连接该进程,然后使用fread/fgets/stream_get_contents来读取该进程返回的结果。跟 exec或system之类的函数不同的是,exec会等待命令执行完

成,再运行下面的代码,但popen不会。proc_open又更加强大一些,支持 stdin和stdout,路径设置等等。

因为这些函数只负责创建,没有相应的管理方法,所以只能在PHP文件内部自己来实现。

演示示例:(PHP多进程并发控制的测试实例)

复制代码 代码示例:

function run($input)

{

global $p_number;

if ($p_number <= 0)

{

$p_number = worker_processes($p_number);

}

$p_number = $p_number - 1;

$out = popen("/bin/sh /opt/zhangyan.sh \"{$input}\" &", "r");

pclose($out);

}

function worker_processes($p_number)

{

$limit = 500;//允许推到后台的最大进程数

while ($p_number <= 0)

{

$cmd = popen("ps -ef | grep \"/opt/zhangyan.sh\" | grep -v grep | wc -l", "r");

$line = fread($cmd, 512);

pclose($cmd);

$p_number = $limit - $line;

if ($p_number <= 0)

{

sleep(1);//暂停1秒钟

}

}

return $p_number;

}

$input = "http://www.jbxue.com"; //模拟从队列文件中读取到的数据

for ($i = 1; $i <= 1000; $i++)

{

run($input);

echo "Idle process number: " . $p_number . "\n";

}

?>

代码说明:

1. 设置/opt/zhangyan.php最多允许生成500个子进程;

2. 当/opt/zhangyan.php读取到一条数据后,将允许生成的子进程数减1(空闲进程数$p_number=500-1=499),然后将数据交给/opt/zhangyan.sh去后台处理,不等待

/opt/zhangyan.sh处理结束,继续读取下一条数据;

3. 当允许生成的子进程数减至0时(空闲进程数$p_number=0),/opt/zhangyan.php会等待1秒钟,然后检查后台还有多少个/opt /zhangyan.sh子进程尚未处理结束;

4. 如果1秒钟之后/opt/zhangyan.php发现后台的/opt /zhangyan.sh子进程数还是500(空闲进程数$p_number=0),会继续等待1秒钟,如此反复;

5. 如果/opt /zhangyan.php发现后台尚未处理结束的/opt/zhangyan.sh子进程数减少到300个了(空闲进程数$p_number=500-300=200),那么/opt/zhangyan.php会再往后台

推送200个/opt/zhangyan.sh子进程;

建议使用pcntl_*系函数更方便一些,逻辑更清楚。

php多进程有什么用,有关php多进程的用法举例相关推荐

  1. python爬虫多进程_Python爬虫技术--基础篇--多进程

    要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回 ...

  2. python多进程map比apply快_python 多进程读写 map

    要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回 ...

  3. python多进程反而慢_python 3.6 多进程的坑

    python 慢是事实, 但是你如果想让他快,使用cpython 也可以,但是前提在你不使用第三方包的情况下,你要用了numpy pandas ,cython 就无法使用了,那只有 使用python的 ...

  4. python queue 多进程_python中的Queue与多进程(multiprocessing)

    最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程 一.先说说Queue(队列对象) Queue是python中的标准库,可以 ...

  5. linux编写多进程程序实验,实验7 编写多进程程序

    实验七编写多进程程序 学生姓名:李亚军学号:6100412196 专业班级:卓越计科121班 1.实验目的 通过编写多进程程序,使读者熟练掌握fork().exec().wait()和waitpid( ...

  6. python多线程和多进程的使用_python多线程与多进程

    python多线程与多进程 python多线程 python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更高层次封装的线程库,接下来 ...

  7. python 多进程_说说Python多线程与多进程的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  8. python多进程优化_『Python』多进程处理

    尝试学习python的多进程模组,对比多线程,大概的区别在: 1.多进程的处理速度更快 2.多进程的各个子进程之间交换数据很不方便 多进程调用方式 进程基本使用multicore() 进程池优化进程的 ...

  9. PHP 会话 线程 进程,接上节我们来了解了解多进程的一些基础进程 / 线程 / 多进程 / 父进程 / 子进程 / 会话 / 控制终端等...

    多进程的一些基础 定义 进程/父进程/子进程 进程是资源调度和分配的一个独立单元 进程是由线程组成 即等于 一个进程 = 一个线程. 进程是由另一个进程创建 (系统进程 init进程除外) 所以会出现 ...

  10. python3多进程写时拷贝_Python实现多进程的详解(附示例)

    本篇文章给大家带来的内容是关于Python实现多进程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. fork函数创建子进程 基本使用 Linux 操作系统提供了一个 ...

最新文章

  1. 开发日记-20190516 关键词 MVVM-代码浏览结束
  2. dede后台栏目管理文章统计数量和实际文章数不一致解决办法
  3. 大整数算术求值 c语言 栈,用C语言实现 多位整数的四则运算,用栈,例如56*(12+20)-102/2...
  4. Angular之ngx-permissions的路由使用
  5. 面霸篇:MQ 的 5 大关键问题详解
  6. 理论基础 —— 查找 —— 顺序查找
  7. cross-validation:从 holdout validation 到 k-fold validation
  8. 数据治理的陷阱与解决方案
  9. dt dl dd 的英文含义
  10. 计算机科学与技术志愿意愿,高考志愿填报如何得高分
  11. 【老兵不朽】时隔1年,jQuery 发布新版 3.4.0
  12. 房产抵押不良资产如何处置?
  13. Apache Kafka-auto.offset.reset参数(earliest、latest、none)含义说明
  14. dms虚拟服务器,iOS UPNP之DMS具体操作,让手机成为DMS服务器
  15. Preparing: insert into user(uuid,username,gender,age,phone,address) values(?,?,?,?,?,?,?)
  16. 单片机c语言报错_asm啥意思,SPMC75系列单片机地C和ASM( - 控制/MCU - 电子发烧友网...
  17. js中的contains
  18. java坦克大战课设报告_java课程设计之坦克大战
  19. 什么样的程序猿适合去创业公司
  20. 浅谈医药工业洁净类厂房智能照明设计与选型

热门文章

  1. 美摄 - 助力打造完善的音视频解决方案
  2. 报告显示H.264份额进一步提升 1080p最受欢迎
  3. 直播预告│据说这是人工智能领域里最难的一门学问……
  4. 如何让xtrabackup恢复速度提升20倍?
  5. 腾讯AI Lab副主任俞栋:语音识别领域的现状与进展
  6. Syslog系统日志配置
  7. srs代码学习(4)-怎么转发流
  8. c++无锁链表的实现
  9. 详解Eureka服务注册与发现和Ribbon负载均衡【纯理论实战】
  10. 【verilog语法】关于testbench与被测module的输入输出数据类型定义:reg/wire原因