Часто нужно запустить обработку данных, которая занимает много времени и ход которой хотелось бы визуально контролировать.
Эти задачи обычно единичные, нет смысла писать к ним визуальный интерфейс, проще запустить в консоли.
Возьмем пример из FAQ для использования вместе с cron и адаптируем для нашей обработки данных с выводом в консоль промежуточных значений, чтобы видеть как исполняется скрипт.
В новых версиях 1c-bitrix отключить буферизацию старым способом через константу
BX_BUFFER_USED уже не получается, поэтому весь вывод скрипта осуществится в момент его завершения, что нас на устраивает.
Посмотрим, что внутри, какие буферы используются.
require($_SERVER["DOCUMENT_ROOT"] .
"/bitrix/modules/main/include/prolog_before.php");
print_r(ob_list_handlers()); |
даст на выходе
Array
(
[0] => default output handler
[1] => default output handler
[2] => CMain::EndBufferContent
) |
Определение константы буферизации BX_BUFFER_USED в true уберет только
CMain::EndBufferContent, остальные уровни буферизации останутся.
Поэтому после подключения ядра добавляем цикл, который сбросит все буферы
while (ob_get_level()) {
ob_end_flush();
} |
Простой пример-счетчик на 10 секунд, выводящий каждую секунду новое число:
#!/usr/bin/php
<?php
set_time_limit(0);
ini_set('mbstring.func_overload', "2";
ini_set('mbstring.internal_encoding', "UTF-8";
$_SERVER["DOCUMENT_ROOT"] = "/var/www/";
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("LANG", "ru";
define("BX_UTF", true);
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
define("BX_BUFFER_USED", true);
require($_SERVER["DOCUMENT_ROOT"]
. "/bitrix/modules/main/include/prolog_before.php";
while (ob_get_level())
ob_end_flush();
$startExecTime = getmicrotime();
for($i = 0; $i< 10; $i++)
{
print "\n$i";
sl eep(1);
}
echo "\nScript works " . (getmicrotime() - $startExecTime) . " sec\n";
require($_SERVER["DOCUMENT_ROOT"]
. "/bitrix/modules/main/include/epilog_after.php";
?>
|