(一)环境配置
PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展。
1.首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是要生成pcntl.so包。
创建一个文件夹下载了整个PHP包,在里面找到了pcntl包。将包放置于/var/www/php文件夹下
#cd /var/www/pcntl
# phpize
# ./configure
# make
# make install
成功生成pcnl.so文件。ubuntu生成文件路径:/usr/lib/php5/20090626+lfs/pcntl.so
2 将pcnl.so文件加载到php环境中。
首先,创建pcntl.ini : /etc/php5/apache2/conf.d/pcntl.ini
内容:extension=pcntl.so
其次,修改php.ini,加载pcntl.so
[pcntl]
extension=pcntl.so
(二)程序设计
$intNum= 4; // 进程总数
$pids= array(); // 进程PID数组
for($i= 0; $i<$intNum; $i++)
{
$pids[$i] = pcntl_fork();// 产生子进程,而且从当前行之下开试运行代码,
而且不继承父进程的数据信息
if($pids[$i] == -1)
{
echo "couldn't fork". "\n";
}
elseif(!$pids[$i])
{
sleep(1);
echo "\n"."第".$i."个进程 -> ". time(). "\n";
switch($i){
case 0:
$result=json_encode(test(0,2));
break;
case 1:
$result=json_encode(test(2,2));
break;
case 2:
$result=json_encode(test(4,2));
break;
case 3:
$result=json_encode(test(6,2));
break;
}
file_put_contents('message.txt',"第".$i."个进程的数据:".$result."\n\r",FILE_APPEND);
echo "\n"."第".$i."个进程 -> " ."抓取页面".$i."-> " . time()."\n";
exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程
}
}
foreach ($pids as $i => $pid) {
if($pid) {
pcntl_waitpid($pid, $status);
}
}
function test($m,$n){
$mysql_server_name='localhost';
$mysql_username='root';
$mysql_password='123456';
$mysql_database='test';
$conn=mysql_connect($mysql_server_name,$mysql_username,
$mysql_password,$mysql_database);
mysql_select_db($mysql_database,$conn);
$sql=mysql_query("select * from user limit {$m},{$n}");
$result=array();
while ($row=mysql_fetch_row($sql)){
$result[]=$row;
}
mysql_close($conn);
return $result;
}
?>
结果:
第0个进程的数据:[["1","test1"],["2","test2"]]
第3个进程的数据:[["7","test7"],["8","test8"]]
第2个进程的数据:[["5","test5"],["6","test6"]]
第1个进程的数据:[["3","test3"],["4","test4"]]