检查多URL状态

  • 本文关键字:状态 URL 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,对我来说,了解哪个服务器离线很重要。有更快的方法吗?

您的功能对我来说几乎是最佳的。我想它的速度很慢,因为某些域没有响应,默认的curlopt_connectTimeout太高了。尝试将curlopt_connectTimeout设置为1,然后将curlopt_timeout设置为2,这应该使其在不响应域上最大2秒钟。

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

最新更新