我想要很多域地址来检查状态。 我尝试多卷曲,但它慢了
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,这对我来说了解哪个服务器处于脱机状态非常重要。 有更快的方法吗?
答案 0 :(得分:0)
你的功能看起来几乎是我的最佳选择。我猜它很慢,因为有些域没有响应,默认的CURLOPT_CONNECTTIMEOUT太高了。尝试将CURLOPT_CONNECTTIMEOUT设置为1,将CURLOPT_TIMEOUT设置为2,这将使其在无响应域上停顿最多2秒。
另外,如果您实际上并不需要http响应代码,但只需检查服务器是否实际接受连接就可以了,也许使用socket_ api会更快。