Мне потребовалось узнать, существуют ли сайты, которые есть в списке. Список большой (достали список всех доменов *.com на осень 2007, там около 55 миллионов доменов). Все конечно проверять нет смысла, но вот первые тысяч 10-100 нужно. Объемы понятное дело огромные, поэтому алгоритм тут будет играть большую роль. Мне на ум пришли три метода: curl, fopen и get_headers. Поэтому я и решил проверить кто из них справится с задачей быстрее.
Далее написал код, который собственно и производит вычисления.
<?php ob_implicit_flush(true); //Выводить по мере поступления данных error_reporting(0); //Буду варнинги, но нам их не надо set_time_limit(0); //Исполнять до победного конца $handle = fopen('dotcom_list','r'); //исходный файл $time_start = microtime(1); $i = 0; while (!feof($handle) and $i < 10) { $i++; $buffer = trim(fgets($handle, 4096)); $site = 'http://www.'.strtolower($buffer).'.com'; echo 'Checking:'.$site.'... '; $curl = curl_init($site); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); $response = curl_exec($curl); curl_close($curl); $file = fopen('sites/'.strtolower($buffer).'.txt', 'a+'); fwrite($file, $response); fclose($file); echo ' Done!'; } $time_end = microtime(1); $time = $time_end - $time_start; echo 'Обработано: '.$i.' за '.$time.''; $time_start = microtime(1); $i = 0; while (!feof($handle) and $i < 10) { $i++; $buffer = trim(fgets($handle, 4096)); $site = 'http://www.'.strtolower($buffer).'.com'; echo 'Checking:'.$site.'... '; $site_handler = fopen($site, 'r'); if ($site_handler) { $response = fread($site_handler, 1024); fclose($site_handler); } else { $response = ''; } $file = fopen('sites/'.strtolower($buffer).'.txt', 'a+'); fwrite($file, $response); fclose($file); echo ' Done!'; } $time_end = microtime(1); $time = $time_end - $time_start; echo 'Обработано: '.$i.' за '.$time.''; $time_start = microtime(1); $i = 0; while (!feof($handle) and $i < 10) { $i++; $buffer = trim(fgets($handle, 4096)); $site = 'http://www.'.strtolower($buffer).'.com'; echo 'Checking:'.$site.'... '; $headers = get_headers($site); $response = $headers[0]; $file = fopen('sites/'.strtolower($buffer).'.txt', 'a+'); fwrite($file, $response); fclose($file); echo ' Done!'; } $time_end = microtime(1); $time = $time_end - $time_start; echo 'Обработано: '.$i.' за '.$time.''; ?>
И вот собственно результаты:
10 сайтов:
curl: Обработано: 10 за 15.06
fopen: Обработано: 10 за 70.10
get_headers: Обработано: 10 за 69.23
50 сайтов:
curl: Обработано: 50 за 123.23
fopen: Обработано: 50 за 288.16
get_headers: Обработано: 50 за 249.84
100 сайтов:
curl: Обработано: 100 за 195.53
fopen: Обработано: 100 за 480.05
get_headers: Обработано: 100 за 527.04
Вывод: curl! curl! curl!
А еще я писал про:










Январь 3rd, 2009 at 05:25
А где код то?
Да и сравнивать то так неккоректно. Курлом насколько я понимаю вы просто пытаетесь установить соединение, а фопен помимо этого выкачивает страницу, отсюда и разница.
Январь 3rd, 2009 at 11:43
Нет, курл тоже вытаскивает страницу. Это get_headers только устанавливает соединение.
Январь 4th, 2009 at 02:43
Ну а код то покажете?:)
Январь 4th, 2009 at 02:59
Дак есть же код) Надо нажать на «Читать далее».
Январь 5th, 2009 at 01:36
Хм, под ие7 увидел, а фф3 не показывает код в упор.
) В прошлом занимался сабмитом в дружественные гостевые с семи-дедика в 10 всего потоков (самый дешевый тариф, сервер без проблем держит 100-150 потоков), получалось около 100к в сутки, это скачивание, выпарсивание формы, её заполнение и отправка назад. Да, и это через публичные прокси, что в переводе на полноценный сервер на 100мбитах и без прокси, в итоге выйдет не менее 1кк ресов\сутки.
И я тут прикинул: возмем быстрейший из получившегося – курл, 100 сайтов за 3 минуты, 2к в час, 48к в сутки.. Смешно жы
В общем думайте в сторону многопоточности, иначе смысла нет что либо оптимизировать.
p.s. софт был покупной, так что как он работает, сказать не могу, зенд.