Проверьте, доступен ли сайт как можно быстрее

0
foreach($links as $link_content)
{
  $handle = curl_init(LINK_BASE.$link_content);
  curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
  $response = curl_exec($handle);
  $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
  if($httpCode != 200)
    continue; //if not, go to next link
}

Мне нужно проанализировать 350 ссылок и проверить, доступен ли каждый из них (возвращает код HTTP 200). В настоящее время я использую код, написанный выше. К сожалению, эта операция занимает очень много времени - более 2-4 минут. Я должен проверить каждую ссылку самым быстрым способом. Можете ли вы дать мне какие-либо предложения?

  • 0
    Перенаправления считаются «доступными»?
  • 1
    Эй, это не дай мне код службы. Это сообщество, где думающие люди помогают друг другу. Не место, чтобы другие делали работу бесплатно.
Показать ещё 4 комментария
Теги:
curl

2 ответа

6

Я бы сказал, что вы просто выдаете HTTP HEAD-запросы, используя CURLOPT_NOBODY а не тянете весь контент, как вы сейчас делаете. Код для этого будет выглядеть так:

foreach($links as $link_content)
{
  $handle = curl_init(LINK_BASE.$link_content);
  curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($handle,  CURLOPT_NOBODY, TRUE); // make HEAD
  $response = curl_exec($handle);
  $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
  if($httpCode != 200)
    continue; //if not, go to next link
}

Если это не уменьшает время как можно больше, вы также можете curl_multi возможности curl_multi для распараллеливания ваших запросов. Вы можете свободно взглянуть на простой класс REST, основанный на завитке, который я создал, чтобы получить несколько лучших примеров того, как делать curl_multi. Вы можете свободно пользоваться классом - https://github.com/mikecbrant/php-rest-client

  • 2
    Можете ли вы дать мне код, как я могу это сделать?
  • 5
    Да ладно @ Ty221. Вы знаете, что SO не является сервисом кодирования.
Показать ещё 2 комментария
1

Вы можете запустить несколько экземпляров этого PHP-кода отдельно. Представьте себе прирост времени с 10 параллельными экземплярами!

Создайте файл crawler.php как crawler.php ниже:

<?php
$fileName = argv[1];
$fh = fopen($fileName, "r");
while($link_content = fgets($fh) !== FALSE) {
    $handle = curl_init(LINK_BASE.$link_content);
    curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
    $response = curl_exec($handle);
    $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
    if($httpCode != 200) {
        // log/output the bad URL
    }
}
?>

Создайте bat файл crawler.bat (если вы находитесь под Windows) и поместите этот код:

php PathToCrawler/crawler.php %1

Теперь вам нужно распространять URLS в разных файлах и запускать консоль последовательно этой битой:

crawler.bat UrlFileFrom1TO100.txt
crawler.bat UrlFileFrom101TO200.txt
crawler.bat UrlFileFrom201TO300.txt
crawler.bat UrlFileFrom301TO400.txt
...
  • 0
    То же самое, пожалуйста, дайте мне немного кода
  • 0
    Еще лучше было бы использовать curl_multi для управления несколькими параллельными запросами curl в одном потоке выполнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню