проверка php URL доступна - PullRequest
4 голосов
/ 15 июня 2011

Я хочу проверить, доступен ли URL из моей базы данных. Я выбираю fopen, но я проверяю 30 строк из своей базы данных, это будет стоить почти 20 секунд. Есть ли способ сделать его более эффективным? Благодаря.

<?php
$start_t = microtime(true); 
//connect database and select query
while ($row = mysql_fetch_array($result)){
//$url = 'http://www.google.com'; //not test from database, but a google.com, one url will cost 0.49 seconds.
$url = $row['url'];
$res = @fopen($url, "r "); 
if($res){
    echo $row['url'].' yes<br />';
}else{
    echo $row['url']. ' no<br />';
}   
}
$end_t = microtime(true);
$totaltime = $end_t-$start_t;
echo "<br />".$totaltime." s";
?>

Ответы [ 4 ]

3 голосов
/ 15 июня 2011

Попробуйте использовать fsockopen, что быстрее fopen

<?php

$t = microtime(true);

$valid = @fsockopen("www.google.com", 80, $errno, $errstr, 30);

echo (microtime(true)-$t);

if (!$valid) {
   echo "Failure";
} else {
   echo "Success";
}
?>

Вывод:

0.0013298988342285
2 голосов
/ 15 июня 2011

Вы можете попробовать использовать CURL с установленным параметром CURLOPT_NOBODY, который использует метод HTTP HEAD и избегает загрузки всей страницы:

$ch = curl_init($row['url']);

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// 400 means not found, 200 means found.
curl_close($ch);

Из документации CURLOPT_NOBODY :

ИСТИНА, чтобы исключить тело из выход. Метод запроса затем устанавливается на ГОЛОВА. Изменение этого значения на FALSE не измените его на GET.

1 голос
/ 15 июня 2011

Попробуйте Bulk URL check, то есть в блоках по 10 или 20

Curl Multi Exec.

http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading

Используйте параметры CURL для NOBODY и HEADERТОЛЬКО так, что ваш ответ будет намного быстрее.

Также не забудьте поставить TIMEOUT для curl, иначе один плохой URL может занять слишком много времени.

Я делал 50 проверок URL за 20 секунд.

Надеюсь, что поможет.

1 голос
/ 15 июня 2011

Вы не можете ускорить такие вещи.

С 30 строками я предполагаю, что вы подключаетесь к 30 различным URL. Для этого уже 20 секунд.

Также я предлагаю вам использовать file_get_contents для извлечения HTML
Или, если вам нужно , чтобы узнать ответ заголовка, используйте get_headers();

Если вы хотите ускорить процесс, просто вызовите больше процессов. Каждый из них получит tot URL.

Добавление

Также не забывайте о великом Zend_HTTP_Client();, который очень хорош для такой задачи

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