:-)
  • PHP 25.11.2008

    Мне потребовалось узнать, существуют ли сайты, которые есть в списке. Список большой (достали список всех доменов *.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!

    А еще я писал про:

    1. Класс wp-poster
    2. PHP: Случайное слово в тексте
    3. Symfony: категории и подкатегории

    Tags: , ,

  • 5 комментариев

    WP_Modern_Notepad
    • bt пишет:

      А где код то?
      Да и сравнивать то так неккоректно. Курлом насколько я понимаю вы просто пытаетесь установить соединение, а фопен помимо этого выкачивает страницу, отсюда и разница.

    • CharnaD пишет:

      Нет, курл тоже вытаскивает страницу. Это get_headers только устанавливает соединение.

    • bt пишет:

      Ну а код то покажете?:)

    • CharnaD пишет:

      Дак есть же код) Надо нажать на «Читать далее».

    • bt пишет:

      Хм, под ие7 увидел, а фф3 не показывает код в упор.
      И я тут прикинул: возмем быстрейший из получившегося – курл, 100 сайтов за 3 минуты, 2к в час, 48к в сутки.. Смешно жы :) ) В прошлом занимался сабмитом в дружественные гостевые с семи-дедика в 10 всего потоков (самый дешевый тариф, сервер без проблем держит 100-150 потоков), получалось около 100к в сутки, это скачивание, выпарсивание формы, её заполнение и отправка назад. Да, и это через публичные прокси, что в переводе на полноценный сервер на 100мбитах и без прокси, в итоге выйдет не менее 1кк ресов\сутки.
      В общем думайте в сторону многопоточности, иначе смысла нет что либо оптимизировать.
      p.s. софт был покупной, так что как он работает, сказать не могу, зенд.

    Trackbacks

    Оставить комментарий

    Внимание: Комментарии проходят премодерацию. Не надо посылать их несколько раз.