PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展,有时间在ubuntu下玩了下。
1.首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是
创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令
# cd php
# apt-get source php5
# cd php5-(WHATEVER_RELEASE)/ext/pcntl
# phpize
# ./configure (注一)
# make
# make install
phpize 命令是用来准备 PHP 外挂模块的编译环境的。
成功的安装将建立 extname.so 并放置于 PHP 的外挂模块目录中 (预设存放于 /usr/lib/php/modules/ 内) 。
需要调整 php.ini,加入 extension=extname.so 这一行之后才能使用此外挂模块。
2,开始实验pcntl_fork
01 |
<?php |
02 |
//while(1)//循环采用3个进程 |
03 |
//{ |
04 |
//declare(ticks=1); |
05 |
$bWaitFlag = FALSE; // 是否等待进程结束
|
06 |
//$bWaitFlag = TRUE; // 是否等待进程结束 |
07 |
$intNum = 3; // 进程总数
|
08 |
$pids = array(); // 进程PID数组
|
09 |
for($i = 0; $i <$intNum; $i++)
|
10 |
{$pids[$i] = pcntl_fork();// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息
|
11 |
/*if($pids[$i])//父进程 |
12 |
{ |
13 |
//echo $pids[$i]."parent"."$i -> " . time(). "\n"; |
14 |
} |
15 |
*/ |
16 |
if($pids[$i] == -1)
|
17 |
{ |
18 |
echo "couldn't fork". "\n";
|
19 |
} |
20 |
elseif(!$pids[$i])
|
21 |
{ |
22 |
sleep(1); |
23 |
echo "\n"."第".$i."个进程 -> " . time(). "\n";
|
24 |
//$url=" http://xxx/comments.php?p=".$i;//抓取页面的例子 |
25 |
//$content = file_get_contents($url); |
26 |
//file_put_contents('message.txt',$content); |
27 |
//echo "\n"."第".$i."个进程 -> " ."抓取页面".$i."-> " . time()."\n"; |
28 |
exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程
|
29 |
} |
30 |
if ($bWaitFlag)
|
31 |
{ |
32 |
pcntl_waitpid($pids[$i], $status, WUNTRACED);echo "wait $i -> " . time() ."\n";}}
|
33 |
//sleep(1); |
34 |
//} |
35 |
?> |