Что-то быстрее, чем get_headers()
Я пытаюсь сделать PHP-скрипт, который будет проверять HTTP-статус сайта как можно быстрее.
В настоящее время я использую get_headers() и запускаю его в цикле из 200 случайных URL-адресов из базы данных MySQL.
Чтобы проверить все 200 - это в среднем 2 м 48 с.
Что я могу сделать, чтобы сделать это (намного) быстрее?
(Я знаю о fsockopen - он может проверять порт 80 на 200 сайтах в 20-е годы - но это не то же самое, что запросить код состояния http, потому что сервер может отвечать на порт - но может не загружать сайты правильно и т. Д.)
Вот код..
<?php
function get_httpcode($url) {
$headers = get_headers($url, 0);
// Return http status code
return substr($headers[0], 9, 3);
}
###
## Grab task and execute it
###
// Loop through task
while($data = mysql_fetch_assoc($sql)):
$result = get_httpcode('http://'.$data['url']);
echo $data['url'].' = '.$result.'<br/>';
endwhile;
?>
2 ответа
Вы можете попробовать библиотеку CURL. Вы можете отправлять несколько запросов одновременно с CURL_MULTI_EXEC
Пример:
$ch = curl_init('http_url');
curl_setopt($ch, CURLOPT_HEADER, 1);
$c = curl_exec($ch);
$info = curl_getinfo($ch, CURLINFO_HTTP_CODE);
print_r($info);
ОБНОВЛЕНО
Посмотри этот пример. http://www.codediesel.com/php/parallel-curl-execution/
Я не знаю, если это вариант, который вы можете рассмотреть, но вы можете запустить все из них почти одновременно, используя вилку, таким образом, сценарий займет чуть больше, чем один запрос http://www.php.net/manual/en/function.pcntl-fork.php
Вы можете добавить это в скрипт, который запускается в режиме cli и запускать все запросы одновременно, например
Изменить: вы говорите, что у вас есть 200 звонков, поэтому вы можете столкнуться с потерей соединения с базой данных. проблема вызвана тем, что ссылка завершается при завершении первого сценария. Чтобы избежать этого, вы можете создать новое соединение для каждого ребенка. Я вижу, что вы используете стандартные функции mysql_*, поэтому обязательно передайте 4-й параметр, чтобы каждый раз создавать новую ссылку. также проверьте максимальное количество одновременных подключений на вашем сервере