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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值