您的位置:首页 > 编程语言 > PHP开发

php通过fork和管道实现多进程

2016-08-31 10:18 501 查看
php通过fork和管道实现多进程

最近遇到两个问题

问题一

做php爬虫,使用fork启动多进程通过curl抓取数据,通过log分析发现只有一个进程能够执行,没找到原因
改用管道去启动多进程则无碍。
`
//多进程
class MultiProcess{
/**
* 启动多个进程运行程序
*
* @param type $func
* @param type $params
* @param type $obj
* @param type $count
* @return type
*/
public static function multProcessRun($func,$params,$obj="",$count=20){
//运行进程
for($i=0;$i<$count;++$i){
if(!isset($params[$i])) continue;
$pid = pcntl_fork();
if($pid == -1){
die("fork error ");
}else if(!$pid){
//if(DEBUG == 1)  usleep(100000);
if(empty($obj)){
$func($params);
}else{
call_user_func_array(array($obj,$func),array($params[$i]));
}
exit(0);
}
}
//等待结束
$ret = false;
while(pcntl_waitpid(0,$status) != -1){
$status = pcntl_wexitstatus($status);
if(DEBUG == 1){
//echo $status.'#';
}
$ret = $ret && $status;
}
return $ret;
}
}

//管道
class Pipler {
/**
* 检查进程的数目
*/
public static function checkProcessCount($str=INFO_SCRIPT_PHP){
exec("ps -ef | grep '".$str."' | grep -v grep | wc -l",$arr,$ret);
return intval(trim($arr[0]));
}
/**
* 运行进程
*/
public static function runProcess($params=array()){
$process_num = self::checkProcessCount();
if($process_num > MAX_PROCESS_COUNT){
return false;
}
$cmd = PHP_EXEC." ".INFO_SCRIPT_PHP." ".  implode(" ", $params);
$cmd .= "  &";
//echo $cmd;
pclose(popen($cmd, "r"));
return true;
}

}

`


问题二

使用本地的存储去记录已经抓取的页面链接,使用sqlite和leveldb都不行,他们都有锁的而我的爬虫是多进程的!!!
因为这个问题迫使我去学习一门支持多进程的静态编程语言。
因为这个原因我打算玩玩c/c++,当然用dlang也可以解决这个问题,可是如果我使用dlang开发这个爬虫以后,下一个维护这个项目的人肯定有杀了我的冲动,说不定他会重写。。java是一个好的选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐