Вывод построчно с помощью PHP

#php #line

#php #строка

Вопрос:

В небольшом приложении, которое я пишу, на этапе установки пользователь должен ввести подробную информацию о подключении к MySQL в форме (имя сервера, имя базы данных, имя пользователя …)

Я хотел бы отображать построчно результат тестов и действий, выполненных в окне, с в конечном итоге небольшой паузой между каждым тестом, например :

«Подключение к серверу …»(2 секунды) «ok» (2 секунды)
«Подключение к базе данных …» (2 секунды) «ok» (2 секунды)
«Создание таблиц …» (2 секунды) «ok»
….и т.д.

Я пробовал использовать ob_start (), flush (), ob_flush (), но это не работает, поскольку мой веб-сервер, похоже, сам буферизует вывод php, поэтому запуск скрипта занимает много времени, но все печатается одновременно.

Я искал здесь и в Google, без какого-либо результата (возможно, не с правильными ключевыми словами)

Можете ли вы указать мне на решение?
с помощью Ajax может быть?

ericc

Комментарии:

1. Ajax не будет решением, вы пытались отключить буферизацию вывода в вашем php.ini?

Ответ №1:

Для этого существует множество решений, но полностью отключить кэширование непросто.
Потому что на стороне сервера есть некоторое кэширование, которое можно отключить, но также существует очень большая вероятность того, что браузер также кэширует.

Чтобы исправить это, у вас есть несколько вариантов:

  • подделайте это, отобразите статическую «анимацию» на основе javascript и перенаправьте, когда закончите.

  • Используйте ajax, передайте скрипту установки echo результаты в текстовый файл / базу данных mysql и используйте другой php-скрипт для загрузки текстового файла / базы данных с заданными интервалами и отображения новых результатов.

  • Используйте новейший потоковый API HTML5 / javascript, который создан именно для подобных вещей, однако довольно сложно найти какую-либо хорошую документацию по этому поводу.

Чтобы отключить кэширование на стороне сервера, я использую этот код:

 @ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i  ) { ob_end_flush(); }
ob_implicit_flush(1);
header('Expires: Fri, 01 Jan 1990 00:00:00 GMT');
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Pragma: no-cache');
header('Connection: close');
  

Комментарии:

1. «заголовок(‘content-type: text /event-stream’);» создайте страницу для загрузки:-o . Остальной ваш код позволяет ему работать в Firefox 3.16 / Linux, но не в Chrome / Linux, и никакой другой комбинации в WindowsXP 🙁

2. в WindowsXP, похоже, это было потому, что я был за прокси. Я подделаю это с помощью jQuery (.fadeIn), это будет приятно и проще

Ответ №2:

Вы пробовали usleep () перед каждой распечаткой?

Редактировать

Вы можете использовать usleep (), чтобы заставить ваш php-скрипт задерживать выполнение, чтобы тексты можно было просматривать один за другим, в ВАШЕМ СЛУЧАЕ это может заменить использование буферизации.

 mysql_connect() successfully -> print something -> usleep(300)
mysql_select_db() successfully -> print something -> usleep(300)
  

Комментарии:

1. В чем преимущество по сравнению со sleep()? И как это решит мою проблему с буфером?

2. В чем преимущество? Вы просматривали это на php.net ? Разница между sleep() и usleep() составляет секунды и миллисекунды. Смотрите мою правку выше о том, как она может заменить буферизацию, конечно, в вашем случае выше.

3. Да, я заглянул в php.net . Но я не вижу разницы или преимущества между использованием sleep () или usleep (), только в том, что я смогу указать время в миллисекундах. Проблема на самом деле на уровне сервера, который буферизует выходные данные php-скрипта и отправляет содержимое только после завершения скрипта

4. Это не то преимущество, о котором стоит говорить 🙂 Использование sleep() и usleep() зависит от ситуации, когда их использовать. Возвращаясь к вашей проблеме, хорошей практикой является использование буферизации, чем задержка вашего кода, мое решение просто краткое и основано на ситуации 🙂