X

Правильный старт для парсера

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

Итак, вперед!

Включаем вывод всех ошибок и предупреждений, сэкономим себе время на отладке

        error_reporting(-1);  
        ini_set('display_errors', 1);

Пробуем выделить себе побольше памяти, если это необходимо

        function ini_size_to_bytes($value)  
        {  
        $value = trim($value);  
            $retval = intval($value);  
      
         switch(strtolower($value[strlen($value) - 1])) {  
                case 'g':  
                    $retval *= 1024;  
                case 'm':  
                    $retval *= 1024;  
                case 'k':  
                    $retval *= 1024;  
                    break;  
            }  
      
            return $retval;  
        } // end of function  
      
      
        if (($current_memory_limit = ini_size_to_bytes(@ini_get('memory_limit'))) < 128 * 1024 * 1024 AND $current_memory_limit > 0) {  
            @ini_set('memory_limit', 128 * 1024 * 1024); // Выделяем скрипту памяти, нужно для хранения данных и обработки больших изображений  
        }

Устанавливаем время жизни скрипта (ниже описано почему так делать не надо)

 set_time_limit(1800);

Разрешаем выполнение скрипта, после отключения пользователя

ignore_user_abort(1);

Разрешаем вывод данных в броузер без кеширования

ob_implicit_flush(1);

Тут можно остановиться, но есть еще несколько советов:

1. Не создавайте бесконечных циклов, без возможности выхода из них. Применяйте хотя бы такой код:

        define('DEBUG', true);  
        while(true) {  
            if (DEBUG && file_exists('./stop.txt')) die('User halt!');  
        }

Так вы сможете обезопасить себя от создания зомби-процессов

2. Не используйте set_time_limit для остановки скрипта, используйте лучше такой код:

    while (true) {  
        // Какие-то действия  
        if ( (time()-$start) > 60 ) break;  
    }

Помните, что set_time_limit убивает процесс, ему все равно что-там происходит (например запись в файл)

3. Не создавайте несколько запущенных копий парсеров, если это не предусмотрено. Это грозит Вам,
как минимум второй копией данных, используйте, что-то вроде такого кода:

        define('MAX_RUN_TIME', 60*60*6); //максимальное время после которого скрипт закончит все задания и прекратит работу  
      
        define('DIE_TIME', MAX_RUN_TIME + 60*15); //максимальное время после которого скрипт будет убит  
      
        set_time_limit(DIE_TIME-30); // Устанавливаем максимальное время исполнения скрипта  
      
        $starttime = 0;  
        if (file_exists('start.txt')) $starttime = intval(file_get_contents('start.txt'));  
        if ((mktime()-$starttime) < DIE_TIME) die('Script already running left '.(mktime()-$starttime).' from '. DIE_TIME);  
        $GLOBALS['start_time'] = mktime();  
        file_put_contents('start.txt', $GLOBALS['start_time']);  
      
        function istimetoexit() {  
          if ( mktime()-$GLOBALS['start_time'] > MAX_RUN_TIME ) return true;  
          return false;  
        }  
      
        while(true) {  
            // Какие-то действия  
            if (istimetoexit()) break;  
        }  
      
       unlink('start.txt'); // Говорим что можно запускать, т.к. мы отработали

4. Не забывайте выставлять локаль для русского регистронезависимого поиска с использованием pcre

    setlocale(LC_ALL, 'ru_RU.CP1251');

5. Используйте кешировнаие при отладке, так Вы снизите риск получить бан, и скорость отладки возрастет

    define('CACHE_DIR','./cache/');  
    define('ALLOW_CACHING', true);  
      
    function get_page($url) {  
     if (ALLOW_CACHING && file_exists(CACHE_DIR.md5($url)))  
       return  file_get_contents(CACHE_DIR.md5($url));  
     $ret= false;  
     if (($ret = file_get_contents($url)) && ALLOW_CACHING)  
        file_put_contents(CACHE_DIR.md5($url), $ret);  
     return $ret;  
    }  
      
    echo '<pre>'.htmlspecialchars(get_page('http://google.com')).'</pre>';

 

Категории: PHP

Комментарии (1)