Chinaunix首页 | 论坛 | 博客
  • 博客访问: 581431
  • 博文数量: 84
  • 博客积分: 1529
  • 博客等级: 上尉
  • 技术积分: 1482
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-27 17:57
文章分类

全部博文(84)

文章存档

2014年(7)

2013年(9)

2012年(20)

2011年(48)

分类: LINUX

2011-08-24 16:56:29

   最近某个项目用php生成文件,但是由于文件量太大,单个进程生成需要很长的时间,所以想并发进行处理。
   网上查找了下相关的资料,php本身是没有多线程的概念的,那就只能用多进程了,再找资料却是有多进程的处理方式。
   首先想到的是pcntl_fork(手册介绍:)起进程起来并发处理,然后底层做了测试,效果也还不错,但是当通过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的外围参数是不可以传数组的
 
阅读(13826) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

亡灵船长2013-07-27 12:55:51

看不懂你的这句 strstr($buffer, 'ff0000')