检查多URL状态

时间:2018-04-20 21:48:45

标签: php curl

我想要很多域地址来检查状态。 我尝试多卷曲,但它慢了

class BotCronJobs extends Controller {

    public function __construct() {
    }

    public function index() {
        $Query = servers::all();    

        $urls = [];
        foreach ($Query as $item){
            $urls[$item->id] = $item->serverUrl;
        }
        var_dump($this->test($urls));
    }

    public function test($urls = []) {

        $status = [];
        $mh = curl_multi_init();
        foreach($urls as $key => $value){
            $ch[$key] = curl_init($value);
            curl_setopt($ch[$key], CURLOPT_NOBODY, true);
            curl_setopt($ch[$key], CURLOPT_HEADER, true);
            curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch[$key], CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch[$key], CURLOPT_SSL_VERIFYHOST, false);
            curl_multi_add_handle($mh,$ch[$key]);
        }

        do {
            curl_multi_exec($mh, $running);
            curl_multi_select($mh);
        } while ($running > 0);

        foreach(array_keys($ch) as $key){
            $status[$key][] = curl_getinfo($ch[$key], CURLINFO_HTTP_CODE);
            $status[$key][] = curl_getinfo($ch[$key], CURLINFO_EFFECTIVE_URL);
            curl_multi_remove_handle($mh, $ch[$key]);
        }

        curl_multi_close($mh);

        return $status;

    }
}

我只需要检查服务器是否在线,每个服务器都有一个ID,这对我来说了解哪个服务器处于脱机状态非常重要。 有更快的方法吗?

1 个答案:

答案 0 :(得分:0)

你的功能看起来几乎是我的最佳选择。我猜它很慢,因为有些域没有响应,默认的CURLOPT_CONNECTTIMEOUT太高了。尝试将CURLOPT_CONNECTTIMEOUT设置为1,将CURLOPT_TIMEOUT设置为2,这将使其在无响应域上停顿最多2秒。

另外,如果您实际上并不需要http响应代码,但只需检查服务器是否实际接受连接就可以了,也许使用socket_ api会更快。