php并发处理

最近某个项目用php生成文件,但是由于文件量太大,单个进程生成需要很长的时间,所以想并发进行处理。

   网上查找了下相关的资料,php本身是没有多线程的概念的,那就只能用多进程了,再找资料却是有多进程的处理方式。

首先想到的是pcntl_fork(手册介绍:http://php.net/manual/en/function.pcntl-fork.php

)起进程起来并发处理,然后底层做了测试,效果也还不错,但是当通过apache调用的时候却无法运行。然后看到了pcntl_fork手册有下面一句:

It is not possible to use the function ‘pcntl_fork’ when PHP is used as Apache module. You can only use pcntl_fork in CGI mode or from command-line.Using this function will result in: ‘Fatal error: Call to undefined function: pcntl_fork()’ 所以只能想其它方法进行处理了。

   后来查看到可以用popen开进程来处理,然后用feof来确定进程是否结束:

  

  1. foreach ($generateFiles as $generateNumber => $generateMsg) {
  •          $generateNumberArr[

$

generateNumber] = popen(“php /var/www/html/DNSnew/include/generateZonfConf.php ” . $generateMsg . ” ” . $serial . ” ” . $forderDir, ‘r’);

  •      }
  •      foreach (

$

generateNumberArr as $generateNumberArr_k =>$generateNumberArr_v) {

  •          while (

!

feof($generateNumberArr_v)) {

  •              $buffer

= fgets($generateNumberArr_v, 4096);

  •             if (

strstr($buffer, ‘ff0000’)) {

  •                 $forderDir =

false;

  •             }
  •              usleep(

100000);

  •          }
  •          pclose(

$

generateNumberArr_v);

  •      }

上述方法很好的解决了我需要处理的问题

备注:对于php的外围参数是不可以传数组的

发表评论

电子邮件地址不会被公开。 必填项已用*标注