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 минут. Я должен проверить каждую ссылку самым быстрым способом. Можете ли вы дать мне какие-либо предложения?
Я бы сказал, что вы просто выдаете 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
Вы можете запустить несколько экземпляров этого 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 ...