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

原创 2016年08月31日 10:18:33

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是一个好的选择。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

pcntl_fork实现PHP多进程

pcntl_fork实现PHP多进程 转自:http://cc.ecjtu.net/posts/pcntl_fork 参考:http://blog.zol.com.cn/2366/article_2...
  • samxx8
  • samxx8
  • 2013年09月05日 14:47
  • 19093

PHP 执行 system、exec 等函数发生错误

往往在调用system、exec 等函数时,要么没有反应,要么出错: 原因很多,以下是抄别人的: =================================================...

php两种实现守护进程的方式。

nohup php demo.php > app.log & 第一种方式,借助nohup...&  命令,nohup表示让程序忽略hang up 信号...

Yii2的异步多线程服务之swoole

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

linux下小工具xxd使用

xxd的作用就是将一个文件以十六进制的形式显示出来,具体选项如下。 -a : 它的作用是自动跳过空白内容,默认是关闭的 -c : 它的后面加上数字表示每行显示多少字节的十六进制数,默认是1...

PHP Linux Cli 模式下利用 pcntl_fork实现多进程处理

php fork太多进程导致整体性能下降,mysql down掉的解决.

1.同事跑了一个php的抓取, 这个会导致非常高的sleep值,大概到好几千的水平.进而mysql会down掉. 写了个crontab #crontab -e * */1 * * * /...

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

因业务需要用到了pcntl_fork 处理多客户端连接处理数据的需求 但测试下来出现一个问题: fork 之后, 若等待子进程返回, 那么程序就会阻塞, 不等待子进程返回, 则会出现僵尸进程 $ob...

linux下通过调用fork函数实现多进程

#include #include #include #include int main(void){ pid_t pid = fork(); if(!pid){ printf(...

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

1、创建管道 #include int pipe(int fd[2]) 2、管道的读写规则: 管道两端可分别用描述字fd[0]以及fd[1]来描述,需...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:php通过fork和管道实现多进程
举报原因:
原因补充:

(最多只允许输入30个字)