Длительная работа скрипта. Вывод информации

Автор: admin 07 Mar 2009 Отзывы Ваш отзыв

Каждый кто когда нибудь писал парсер, обработчик базы данных, спамилку или какой-либо скрипт, сталкивался с проблемой принудительного прерывания исполнения программы, если программа была запущена через обычный браузер. Подкатом некоторое решение, которое в явном, законченном виде мне не удалось найти в сети.

Итак, что от чего же зависит время исполнения скрипта (речь о PHP) ? Введем понятие timeout - буквально выход времени, время по истечению которого что-то заканчивается. На таймаут работы скрипта влияют следующие параметры:

  • лимит max_execution_time на выполнение скрипта в php.ini
  • лимит timeout в httpd.conf веб сервера apache
  • таймаут браузера, именно о нем и пойдет речь в данной заметке

По личным наблюдениям, таймаут браузера обычно равен 60 секундам (браузеров много, поэтому данное наблюдение является субъективным). После истечения 60 секунд соединение с сервером рвется и вы получается незавершенную программу. Чтобы этого не происходило, браузер должен получать какую либо информацию от сервера каждые 60 секунд или чаще. Кроме того, существует переменная в php.ini, отвечающая за размер output buffer (буфер вывода), размер которой обычно установлен в 4 килобайта. То есть прежде чем информация попадает в браузер, 4 килобайта этой информации должны накопиться в буфере вывода.

Предположим вы пишите скрипт, который будет запускаться как через браузер, так и через крон/шелл . Во втором случае по большому счету вывод информации не нужен. В случае нашего желания увидеть информацию, поэтапно выводимую в браузере (по мере исполнения скрипта), нужно сделать две вещи - сделать что-то с буфером вывода (с его размером скажем) и использовать после вывода на печать части информации функцию очистки и вывода в браузер.

Чтобы уменьшить размер буфера вывода, можно изменить его значение посредством .htaccess , который нужно поместить в тот же каталог, где находится исполняемый скрипт, и поместить в нем строку, переопределяющую размер буфера вывода PHP:

  • php_value output_buffering 0

в данном случае установлен размер 0 байт. Это позволит следующей функции выводить информацию используя функцию flush(), сразу после функции вывода на печать - echo или print_r.

Функция:

function print_log($message)
{
global $log,$_GET;
if($_GET['info']==”yes”){echo $message;flush();}

$log.=$message;
return $log;
}

Вызов: print_log(’Начало процесса<br>’);

Если по каким то причинам вы не можете установить значение размера буфера вывода в 0, можно заполнять буфер комментариями, которые не будут отображаться в браузере, но дадут возможность выдавать информацию сразу, а не по заполнению буфера вывода. Функция в таком случае будет выглядеть так:

function print_log($message)
{
global $log,$_GET;

$empty=’<!– –><!– –>‘;//количество <!– –> варьируем по своему усмотрению (>10)
if($_GET['info']==”yes”){echo $message.
$empty;flush();}

$log.=$message;
return $log;
}

Обратите внимание на переменную $log, которая накапливает всю текстовую информацию, которая затем может быть записана в файл. Сам скрипт запускаем с параметром: ?info=yes

Успехов.

Рубрика: Programming

Теги:

Ссылка на заметку:

Отзывов нет

Комментариев пока нет.

Оставьте свой отзыв

Имя Сообщение
E-mail (обязательно)
Введите 5 + 2 =