有些时候,你需要对一些脚本进行优化,以期跑的更快,在更短的时间内完成任务。PCNTL是一个不错的选择,它可以fork多个进程,来协同完成一个任务,理论上完成的时间将会和进程数成反比。

不过,PCNTL只能用于CLI模式下,不能用于Web服务器环境,否则可能会带来意料之外的错误,不推荐使用。

  • 安装PCNTL扩展:

    wget http://cn2.php.net/distributions/php-5.3.27.tar.bz2
    tar -jxvf php-5.3.27.tar.bz2
    cd php-5.3.27/ext/pcntl/
    phpize && ./configure && make install
    echo "extension=pcntl.so" >> /application/php5.3.27/lib/php.ini
    kill -USR2 `cat /var/run/php-fpm.pid`
    下载->解压->编译->添加扩展模块->重启php-fpm

    注意:线上web服务器中,PHP编译时已经集成该函数,不需要再单独添加,否则会报warning。

    • 程序实例:

      程序流程在注释中已经比较详细的说明了,这里不再单独叙述。
    • 执行结果:

      从结果中可以看出来,虽然程序中fork子进程是有序的,但是在实际执行中并不一定是有序的,进程完成的顺序与进程开始的顺序也不是保持一致的。
      fork前,子进程可以继承父进程的东西,但是在pcntl_fork()后子进程和父进程就没有任何继承关系了。在子进程里创建的东西是子进程的,在父进程创建的东西是父进程的,可以完全看成是两个独立的进程。
      fork后,程序出了分岔,派生出了两个进程,具体哪个先运行,哪个先结束就看该系统的调度算法了。
    • demo
    • <?php
      /**
      * pcntl test
      * @author: xxxx
      */ set_time_limit(0); //如果找不到pcntl_fork函数,直接退出
      if (! function_exists('pcntl_fork')) echo "PCNTL functions not available on this PHP installation\n"; //脚本运行开始
      $start = time();
      echo "\nSCRIT RUN AT: ", date('Y-m-d H:i:s', $start), "\n"; //从CLI取参数
      //默认跑10个进程
      $pmax = empty($argv[1]) ? 10 : $argv[1];
      //父进程pid
      $ppid = getmypid();
      for ($i = 1; $i <= $pmax; ++$i) {
      //开始产生子进程
      $pid = pcntl_fork();
      switch ($pid) {
      case -1:
      // fork失败
      echo "Fork failed!\n";
      break;
      case 0:
      // fork成功,并且子进程会进入到这里
      sleep(1);
      $cpid = getmypid(); //用getmypid()函数获取当前进程的PID
      echo "FORK: Child #{$i} #{$cpid} is running...\n";
      //子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程
      exit($i);
      break;
      default:
      // fork成功,并且父进程会进入到这里
      if ($i == 1) {
      echo "Parent #{$ppid} is running...\n";
      }
      break;
      }
      } //父进程利用while循环,并且通过pcntl_waitpid函数来等待所有子进程完成后才继续向下进行
      while (pcntl_waitpid(0, $status) != -1) {
      //pcntl_wexitstatus返回一个中断的子进程的返回代码,由此可判断是哪一个子进程完成了
      $status = pcntl_wexitstatus($status);
      echo "Child $status has completed!\n";
      } echo "Parent #{$ppid} has completed!\n"; echo "\nSCRIT END AT: ", date('Y-m-d H:i:s', $start), "\n";
      echo "TOTAL TIMEEEE: " . (time() - $start)/60;
      echo "\n++++++++++++++++++++++++++++++++++++++++++++OK++++++++++++++++++++++++++++++++++++++++++++++++++\n";
      ?>

CLI下另一种多进程实现方式----PCNTL的更多相关文章

  1. ASP.NET MVC下的四种验证编程方式[续篇]

    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...

  2. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  3. ASP.NET MVC下的四种验证编程方式[续篇]【转】

    在<ASP.NET MVC下的四种验证编程方式> 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”.“标注ValidationAttribute特性”.“ ...

  4. ASP.NET MVC下的四种验证编程方式【转】

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...

  5. Asp.Net Core下的两种路由配置方式

    与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...

  6. linux 下的两种软件安装方式 —— 源码(编译、安装),编译好的二进制(直接安装)

    我们以 GPG(加密工具)为例来说明两种安装方式的区别: 源码(Source code releases,名称中则会含有src等说明信息,tarball:source),先编译再安装 GPU 的源码地 ...

  7. position relative top失效的问题,温习下常用两种的居中方式

    因为body和html,默认高度是auto 所以相对于他们作为父元素设置position:relative的top值需要加上body,html{height:100%;} <!DOCTYPE h ...

  8. 四种数据持久化方式(下) :SQLite3 和 Core Data

    在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...

  9. android环境下两种md5加密方式

    在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...

随机推荐

  1. Asp.net MVC 利用自定义RouteHandler来防止图片盗链

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

  2. (三)WebRTC手记之本地视频采集

    转自:http://www.cnblogs.com/fangkm/p/4374610.html 前面两篇文章介绍WebRTC的运行流程和使用框架接口,接下来就开始分析本地音视频的采集流程.由于篇幅较大 ...

  3. android:layout_weight属性详解(转)

    在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示.android并没用提 ...

  4. Windbg 双机代码同步调试设置

    Windbg的设置 Windbg的设置 Windbg本身可以直接从微软的网站上下载下载地址:http://www.microsoft.com/whdc/devtools/debugging/defau ...

  5. VMware安装、配置CentOS

    出处:http://www.cnblogs.com/jlily/ 1. 准备CentOS安装镜像文件 官网下载地址:http://www.centos.org/download/ 官方有三个版本:DV ...

  6. C# 中Datetime类用法总结

    收集了一些记录下来,这些有的是从网上找的,有些是自己使用到的: DateTime dt = DateTime.Now; dt.ToString();//2005-11-5 13:21:25dt.ToF ...

  7. Hark的数据结构与算法练习之鸡尾酒排序

    算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从 ...

  8. html 音频视频

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. cf 333b

    G - Chips Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit S ...

  10. Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...