我想要大量域地址来检查状态。我尝试多卷曲,但它会慢
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会更快。