php并发处理

转自: http://blog.chinaunix.net/uid-25311424-id-2379661.html

   最近某个项目用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) {
  2.          $generateNumberArr[$generateNumber] = popen("php /var/www/html/DNSnew/include/generateZonfConf.php " . $generateMsg . " " . $serial . " " . $forderDir, 'r');    
  3.      }

  4.      foreach ($generateNumberArr as $generateNumberArr_k =>$generateNumberArr_v) {
  5.          while (! feof($generateNumberArr_v)) {
  6.              $buffer = fgets($generateNumberArr_v, 4096);
  7.             if (strstr($buffer, 'ff0000')) {
  8.                 $forderDir = false;
  9.             }
  10.              usleep(100000);
  11.          }
  12.          pclose($generateNumberArr_v);
  13.      }
上述方法很好的解决了我需要处理的问题
备注:对于php的外围参数是不可以传数组的

你可能感兴趣的:(php并发处理)