Что-то быстрее, чем 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-й параметр, чтобы каждый раз создавать новую ссылку. также проверьте максимальное количество одновременных подключений на вашем сервере

Другие вопросы по тегам