Могу ли я иметь эквивалент ob_implicit_flush () и ob_end_flush () в php.ini? - PullRequest
1 голос
/ 22 мая 2019

При пошаговом прохождении кода PHP во время отладки (например, в Netbeans) я хочу немедленно увидеть вывод PHP в моем браузере.Это может быть достигнуто (по крайней мере, при использовании PHP7.2 и Firefox) путем включения следующего в начале кода PHP:

  ob_implicit_flush ();
  while (@ob_end_flush());

Это гарантирует, что такие вещи, как

echo "foo\n";

немедленно приводит к отображению 'foo' в веб-браузере, а не к тому, что выходной буфер должен быть сброшен или код PHP завершается после завершения или ошибки.

Но есть ли способ добиться этого путем редактирования php.ini, так что мне не нужно включать его в каждый бит кода PHP для отладки?(Я понимаю, что это приведет к снижению производительности, но это только для целей разработки и отладки.)

1 Ответ

1 голос
/ 22 мая 2019

Очистка буфера вывода - это неявное действие, которое должен выполнить разработчик, поэтому его нельзя включать или отключать в php.ini.

Тем не менее, PHP имеет функцию под названием ticks, которая позволяет разработчику регистрировать функцию обратного вызова для вызова каждые X строк кода, которые выполняются.

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

Пример:

declare(ticks=1);
function autoFlushBuffer() {
  ob_implicit_flush ();
  while (@ob_end_flush());
}
register_tick_function("autoFlushBuffer", true);

// The following lines will appear in your web browser one by one:
echo "one";
sleep(1);
echo "two";
sleep(1);
echo "three";
sleep(1);
...