+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Отключаем буферизацию в консольных скриптах битрикса

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

Возьмем пример из 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";
?>


Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...