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
...
curl_multi
для управления несколькими параллельными запросами curl в одном потоке выполнения.