关闭

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

标签: php爬虫
1518人阅读 评论(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
查看评论

pcntl_fork实现PHP多进程

pcntl_fork实现PHP多进程 转自:http://cc.ecjtu.net/posts/pcntl_fork 参考:http://blog.zol.com.cn/2366/article_2365152.html 听说PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓...
  • samxx8
  • samxx8
  • 2013-09-05 14:47
  • 20422

PHP中Redis管道

Redis是一个TCP服务器,支持请求/响应协议。 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应。服务器处理命令并将响应发送回客户端。 如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,有redis服务器依...
  • weijianfengyu
  • weijianfengyu
  • 2017-03-17 16:58
  • 1927

用popen实现在PHP代码异步调用服务器端的shell脚本

先看代码: Php代码   //php code ...      //然后执行一个服务器端操作   pclose(popen("/usr/loca...
  • u010412301
  • u010412301
  • 2017-02-28 20:23
  • 1469

PHP多进程处理并行处理任务实例

本文目的 本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步。写得比较简单,作为备忘录。 PHP多进程 通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器...
  • u014511737
  • u014511737
  • 2015-07-22 15:15
  • 7110

php爬虫教程(五)提高爬虫抓取效率

多进程抓取
  • u014017080
  • u014017080
  • 2016-08-30 16:16
  • 2429

php pcntl_fork 多进程僵尸进程的问题

因业务需要用到了pcntl_fork 处理多客户端连接处理数据的需求 但测试下来出现一个问题: fork 之后, 若等待子进程返回, 那么程序就会阻塞, 不等待子进程返回, 则会出现僵尸进程 $obj = new service('127.0.0.1', 50000); $obj-...
  • system1024
  • system1024
  • 2016-04-15 16:18
  • 7277

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

php通过fork和管道实现多进程最近遇到两个问题问题一做php爬虫,使用fork启动多进程通过curl抓取数据,通过log分析发现只有一个进程能够执行,没找到原因 改用管道去启动多进程则无碍。 ` //多进程 class MultiProcess{ /** * 启动多个进...
  • cabing2005
  • cabing2005
  • 2016-08-31 10:18
  • 1518

PHP中利用Redis管道加快执行

$redis->muti($mode)->get($key)->set($key)->exec();  既然是这样的, 也就是说当我要使用管道执行一万次操作的时候需要写一万次操作在muti()的后面,,,还是我找到更好的写法? 设计者没有想到这个问题么?今天测试...
  • zzz_781111
  • zzz_781111
  • 2013-06-21 17:04
  • 9554

fork、execl , waitpid实现父子进程管道间通讯

1、创建管道 #include int pipe(int fd[2]) 2、管道的读写规则: 管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一...
  • ostar_liang
  • ostar_liang
  • 2014-05-20 10:03
  • 1229

多进程编程之进程间通信-管道和消息队列

1.进程间通信Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道、消息队列、共享内存、信号量、套接口等等。 2.2.1 管道管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信...
  • ljp1919
  • ljp1919
  • 2016-09-21 10:27
  • 3508
    个人资料
    • 访问:174878次
    • 积分:3943
    • 等级:
    • 排名:第9531名
    • 原创:224篇
    • 转载:24篇
    • 译文:0篇
    • 评论:10条
    博客专栏