php多进程实现

PHP有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能在nginx系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。

CentOS 6 下yum安装php的,默认是不安装pcntl的,因此需要单独编译安装,首先下载对应版本的php,解压后

  1. cd php-version/ext/pcntl
  2. phpize
  3. ./configure && make && make install
  4. cp /usr/lib/php/modules/pcntl.so /usr/lib64/php/modules/pcntl.so
  5. echo "extension=pcntl.so" >> /etc/php.ini
  6. /etc/init.d/httpd restart

方便极了。

下面是示例代码:

    1. <?php
    2. header('content-type:text/html;charset=utf-8' );
    3. // 必须加载扩展
    4. if (!function_exists("pcntl_fork")) {
    5. die("pcntl extention is must !");
    6. }
    7. //总进程的数量
    8. $totals = 3;
    9. // 执行的脚本数量
    10. $cmdArr = array();
    11. // 执行的脚本数量的数组
    12. for ($i = 0; $i < $totals; $i++) {
    13. $cmdArr[] = array("path" => __DIR__ . "/run.php",  'pid' =>$i ,'total' =>$totals);
    14. }
    15. /*
    16. 展开:$cmdArr
    17. Array
    18. (
    19. [0] => Array
    20. (
    21. [path] => /var/www/html/company/pcntl/run.php
    22. [pid] => 0
    23. [total] => 3
    24. )
    25. [1] => Array
    26. (
    27. [path] => /var/www/html/company/pcntl/run.php
    28. [pid] => 1
    29. [total] => 3
    30. )
    31. [2] => Array
    32. (
    33. [path] => /var/www/html/company/pcntl/run.php
    34. [pid] => 2
    35. [total] => 3
    36. )
    37. )
    38. */
    39. pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。
    40. foreach ($cmdArr  as   $cmd) {
    41. $pid = pcntl_fork();    //创建子进程
    42. //父进程和子进程都会执行下面代码
    43. if ($pid == -1) {
    44. //错误处理:创建子进程失败时返回-1.
    45. die('could not fork');
    46. } else if ($pid) {
    47. //父进程会得到子进程号,所以这里是父进程执行的逻辑
    48. //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:
    49. pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。
    50. } else {
    51. //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
    52. $path   = $cmd["path"];
    53. $pid = $cmd['pid'] ;
    54. $total = $cmd['total'] ;
    55. echo exec("/usr/bin/php {$path} {$pid} {$total}")."\n";
    56. exit(0) ;
    57. }
    58. }
    59. ?>

php多进程实现的更多相关文章

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. 取代SharedPreferences的多进程解决方案

    Android的SharedPreferences用来存储一些键值对, 但是却不支持跨进程使用. 跨进程来用的话, 当然是放在数据库更可靠啦, 本文主要是给作者的新库PreferencesProvid ...

  3. python 多进程使用总结

    python中的多进程主要使用到 multiprocessing 这个库.这个库在使用 multiprocessing.Manager().Queue时会出问题,建议大家升级到高版本python,如2 ...

  4. Nginx深入详解之多进程网络模型

    一.进程模型        Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构.与Memcached的经典多线程模型相比,Nginx是经典的多进程模型.Nginx启动后以daemon ...

  5. Python的多线程(threading)与多进程(multiprocessing )

    进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...

  6. 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)

    Python的socket高级应用(多进程,协程与异步)

  7. PHP的pcntl多进程

    PHP使用PCNTL系列的函数也能做到多进程处理一个事务.比如我需要从数据库中获取80w条的数据,再做一系列后续的处理,这个时候,用单进程?你可以等到明年今天了...所以应该使用pcntl函数了. 假 ...

  8. 初探PHP多进程

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  9. gdb进程调试,多进程调试

    1.单进程的调试 常规的通过gdb cmd这种方式开启调试,特别说明的是通过attach的方法附加到一个指定的进程上去进行调试,这种方法适合于调试一个已经运行的进程,具体用法:  gdb -p [pi ...

  10. python高级之多进程

    python高级之多进程 本节内容 多进程概念 Process类 进程间通讯 进程同步 进程池 1.多进程概念 multiprocessing is a package that supports s ...

随机推荐

  1. Computation expressions: Introduction

    本文仅为对原文的翻译,主要是记录以方便以后随时查看.原文地址为http://fsharpforfunandprofit.com/posts/computation-expressions-intro/ ...

  2. 用makecert.exe生成一个自签名的证书

    makecert.exe不用去找,安装VS2008后,在开始菜单相应的路径找到该命令提示符:Microsoft Visual Studio 2008/Visual Studio Tools/Visua ...

  3. JS学习之路,之弹性运动框架

    弹性运动:顾名思义,就如同物理中的加速减速运动,当开始时速度过大,到达终点时,速度不会立刻停下,而是再前进一段距离,而后再向相反方向运动,如此往复. var timer=null; var speed ...

  4. 深入JVM锁机制1-synchronized

    目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...

  5. AUTO_INCREMENT列在InnoDB里如何工作

    如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值.自动增长计数器仅被存储在主内存中,而不是存在磁盘上. Inn ...

  6. 手机下的ev.pageX无效

      把  ev.pageX  换成  e.originalEvent.targetTouches[0].pageX;   例子: var start_x, start_y, end_x, end_y, ...

  7. C# for循环嵌套

    今天,我主要学习了for循环的嵌套. 第一个部分主要学习了打印直角在不同方向的三角形,求阶乘的和以及打印九九乘法表等. 例:打印直角在左下角的三角形. Console.WriteLine(" ...

  8. 模拟SPI协议时序

    SPI是串行外设接口总线,摩托罗拉公司开发的一种全双工,同步通信总线,有四线制和三线制. 在单片机系统应用中,单片机常常是被用来当做主机(MASTER),外围器件被当做从机(SLAVE). 所以,在以 ...

  9. 浅析js模板引擎

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  10. Tcp Socket非阻塞recv

    最近看了许多关于网络编程的资料,自己小记一下,以方便以后查找. 什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件 ...