В настоящее время я пишу сценарий PHP, который должен проверять, является ли URL-адрес текущим (возвращает код HTTP 200 или перенаправляет на такой URL-адрес).
Так как несколько URL-адресов, которые должны быть протестированы, возвращают файл, я бы хотел избежать использования обычного запроса GET, чтобы фактически не загружать файл.
Обычно я использую метод HTTP HEAD, однако тесты показывают, что многие серверы не распознают его и возвращают код HTTP, отличный от соответствующего запроса GET.
Моя идея заключалась в том, чтобы сделать запрос GET и использовать CURLOPT_HEADERFUNCTION, чтобы определить функцию обратного вызова, которая проверяет код HTTP в первой строке заголовка, а затем немедленно завершает запрос, возвращая 0 (вместо длины заголовка), если это не код перенаправления.
Мой вопрос: это нормально, чтобы завершить HTTP-запрос, как это? Или это будет иметь негативные последствия для сервера? Будет ли это на самом деле избежать ненужной загрузки?
Пример кода (не проверено):
$url = "http://www.example.com/";
$ch = curl_init($url);
curl_setopt_array($ch, array(
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => true,
CURLINFO_HEADER_OUT => true,
CURLOPT_HTTPGET => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADERFUNCTION => 'requestHeaderCallback',
));
$curlResult = curl_exec($ch);
curl_close($ch);
function requestHeaderCallback($ch, $header) {
$matches = array();
if (preg_match("/^HTTP/\d.\d (\d{3}) /")) {
if ($matches[1] < 300 || $matches[1] >= 400) {
return 0;
}
}
return strlen($header);
}
Да, это хорошо, и да, это остановит передачу прямо там.
Это также приведет к разрыву соединения, что является проблемой, только если вы собираетесь делать много запросов к одному и тому же хосту, так как поддержание соединения может быть полезным для производительности.
Других решений пока нет …