关闭

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

标签: php爬虫
936人阅读 评论(0) 收藏 举报
分类:

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是一个好的选择。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:136700次
    • 积分:3466
    • 等级:
    • 排名:第9942名
    • 原创:214篇
    • 转载:22篇
    • 译文:0篇
    • 评论:9条
    博客专栏