Я хочу много доменных адресов для проверки статуса. Я пробую несколько завитушек, но это медленно
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;
}
}
Мне просто нужно проверить, находится ли сервер в сети или нет, и у каждого сервера есть идентификатор, мне важно понимать, какой сервер отключен. есть ли более быстрый способ?






ваша функция мне кажется почти оптимальной. Я предполагаю, что это медленно, потому что некоторые домены не отвечают, а значение CURLOPT_CONNECTTIMEOUT по умолчанию слишком велико. попробуйте установить CURLOPT_CONNECTTIMEOUT на 1 и CURLOPT_TIMEOUT на 2, это должно заставить его остановиться максимум на 2 секунды на не отвечающих доменах.
Кроме того, если вам действительно не нужен код ответа http, но можно просто проверить, действительно ли сервер принимает соединения или нет, возможно, использование socket_ api будет быстрее.