Это нормально, чтобы завершить HTTP-запрос в функции обратного вызова, установленной CURLOPT_HEADERFUNCTION?

В настоящее время я пишу сценарий 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);
}

1

Решение

Да, это хорошо, и да, это остановит передачу прямо там.

Это также приведет к разрыву соединения, что является проблемой, только если вы собираетесь делать много запросов к одному и тому же хосту, так как поддержание соединения может быть полезным для производительности.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]