Правильный старт для парсера
Для того чтобы тратить наименьшее время на разработку, я всегда начинаю писать парсер с конфигурации его работы в системе.
Итак, вперед!
Включаем вывод всех ошибок и предупреждений, сэкономим себе время на отладке
1 2 3 4 |
error_reporting(-1); ini_set('display_errors', 1); |
Пробуем выделить себе побольше памяти, если это необходимо
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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); // Выделяем скрипту памяти, нужно для хранения данных и обработки больших изображений } |
Устанавливаем время жизни скрипта (ниже описано почему так делать не надо)
1 2 3 |
set_time_limit(1800); |
Разрешаем выполнение скрипта, после отключения пользователя
1 2 3 |
ignore_user_abort(1); |
Разрешаем вывод данных в броузер без кеширования
1 2 3 |
ob_implicit_flush(1); |
Тут можно остановиться, но есть еще несколько советов:
1. Не создавайте бесконечных циклов, без возможности выхода из них. Применяйте хотя бы такой код:
1 2 3 4 5 6 |
define('DEBUG', true); while(true) { if (DEBUG && file_exists('./stop.txt')) die('User halt!'); } |
Так вы сможете обезопасить себя от создания зомби-процессов
2. Не используйте set_time_limit для остановки скрипта, используйте лучше такой код:
1 2 3 4 5 6 |
while (true) { // Какие-то действия if ( (time()-$start) > 60 ) break; } |
Помните, что set_time_limit убивает процесс, ему все равно что-там происходит (например запись в файл)
3. Не создавайте несколько запущенных копий парсеров, если это не предусмотрено. Это грозит Вам,
как минимум второй копией данных, используйте, что-то вроде такого кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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
1 2 3 |
setlocale(LC_ALL, 'ru_RU.CP1251'); |
5. Используйте кешировнаие при отладке, так Вы снизите риск получить бан, и скорость отладки возрастет
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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>'; |
Author: | Tags: /
| Rating:
1 comment.
Write a comment