Вывод построчно с PHP - PullRequest
0 голосов
/ 26 мая 2011

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

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

"Соединение с сервером ..." (2 с) "ок"(2 с)
" Соединение с базой данных ... "(2 с)" ок "(2 с)
" Создание таблиц ... "(2 с)" ок "
.... и т. Д.

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

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

Можете ли вы указать мне решение?
с Аяксом может быть?

Эрик

Ответы [ 2 ]

1 голос
/ 26 мая 2011

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

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

  • подделка, отображение статической анимации на основе 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 голос
/ 26 мая 2011

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

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

Вы можете использовать usleep (), чтобы сделать ваш phpскрипт задерживает выполнение, так что тексты могут быть просмотрены один за другим, он может заменить использование буферизации в вашем случае.

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