Как проверить, существует ли URL с PHP и сделать его тайм-аут через несколько секунд - PullRequest
3 голосов
/ 21 октября 2011

До сих пор я использовал 2 разных метода проверки URL:

$h = @get_headers($url);
$status = array();
preg_match('/HTTP\/.* ([0-9]+) .*/', $h[0] , $status);
return ($status[1] == 200);

и

$file_headers = @get_headers($url);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
$exists = false;
}
else {
    $exists = true;
}
return $exists;

Я просто не уверен, как я могу сделать эти запросы тайм-аут после указанного количества секунд. Мой сценарий зависает на несколько минут, когда URL-адрес не существует, прежде чем он, наконец, возвращается в автономное состояние Есть идеи?

РЕШЕНИЕ:

Используется Curl для установки времени ожидания с использованием следующего кода:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($curl);
curl_close($curl);
preg_match("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches);
return ($matches[1] == 200);

Ответы [ 3 ]

4 голосов
/ 21 октября 2011

Вам придется свернуть свои собственные fsockopen() с включенными обработчиками URL, что позволяет указать время ожидания.Но затем вы застряли в создании собственного HTTP-запроса с нуля, поэтому лучшим решением будет использование curl .Вы можете легко создать запрос заголовка и указать время ожидания с помощью CURLOPT_CONNECTIMEOUT (для соединения) и CURLOPT_TIMEOUT (общее время ожидания).

1 голос
/ 21 октября 2011

Для этого вы можете использовать контексты потока.См .: http://us2.php.net/manual/en/context.http.php.

Вы можете создать контекст с коротким таймаутом и методом HEAD и использовать file_get_contents () для его извлечения.

Быстрый пример:

$context = stream_context_create(array('http' => array(
    'method' => 'HEAD',
    'timeout' => 10
)));

$response = file_get_contents($url, false, $context);
$exists = ($response !== false);

Для этого необходимо включить HTTP-оболочки;см .: http://php.net/manual/en/wrappers.http.php. Если вы хотите попасть в заголовки ответа, вы должны получить доступ к специальному глобальному $http_response_header.

0 голосов
/ 21 октября 2011

попробуйте функцию stream_set_timeout:

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