zoukankan      html  css  js  c++  java
  • php并发请求

    一般在php进行请求url的时候,直接用 fopen 函数就可以搞定了,比如像这样:

    $file=fopen("http://www.cnblogs.com","r") or exit("");
    $ret="";
    
    while (!feof($file)){
        $ret=$ret.fgetc($file);
    }
    fclose($file);
    
    echo $ret;

    当然,也可以直接用 socket 方式,自己定义好http头参数手动实现:

    $host="www.cnblogs.com";
    $port=80;
    
    $content="GET / HTTP/1.1
    ".
        "Accept: */*
    ".
        "Connection: Keep-Alive
    ".
        "Host: $host";
    
    $fp = fsockopen($host, $port, $errno, $errstr, 30);
    if ($fp) {
        fwrite($fp, $content);
        while (!feof($fp)) {
            $ret.=fgets($fp, 128);
        }
        fclose($fp);
    }
    echo $ret;

    但这些请求方式都是阻塞的,如果需要同时进行多请求的话,就得借助于curl了。

    其实php下可以有两种方式使用curl,一种是直接用exec函数调用命令式的curl,这个没什么多说的,跟直接命令使用没什么区别,只是被放在php里调用了而已。

    php自己也对 curl 进行了包装,这里我们需要使用到 curl_multi_ 的一些方法实现:

    function curl_multi_request ($query_arr) {
        $ch = curl_multi_init();
        $count = count($query_arr);
        $ch_arr = array();
        for ($i = 0; $i < $count; $i++) {
            $query_string = $query_arr[$i];
            $ch_arr[$i] = curl_init($query_string);
            curl_setopt($ch_arr[$i], CURLOPT_RETURNTRANSFER, true);
            curl_multi_add_handle($ch, $ch_arr[$i]);
        }
        $running = null;
        do {
            curl_multi_exec($ch, $running);
        } while ($running > 0);
        for ($i = 0; $i < $count; $i++) {
            $results[$i] = curl_multi_getcontent($ch_arr[$i]);
            curl_multi_remove_handle($ch, $ch_arr[$i]);
        }
        curl_multi_close($ch);
        return $results;
    }

    核心就是循环地调用 curl_multi_exec 方法来并发地进行url请求即可。

    谢谢。

  • 相关阅读:
    HDU1171(01背包均分问题)
    HDU2159(完全背包)
    HDU1203(01背包变形)
    DAG上的DP
    ADB命令小结
    HDU3065(AC自动机入门题)
    HDU2896(AC自动机入门题)
    性能测试监控分析(13)-sysstat安装升级
    tomcat(9)-linux apache tomcat集群环境搭建
    nginx(4)-负载均衡的5种策略及原理
  • 原文地址:https://www.cnblogs.com/Random/p/3221487.html
Copyright © 2011-2022 走看看