ob_flush
записывает буфер. Другими словами, ob_flush
сообщает PHP, чтобы он выдал Apache (или nginx / lighttpd / что-то еще), а затем PHP забыл об этом. Как только Apache получает результат, он делает с ним все, что хочет. (Другими словами, после ob_flush
это вне вашего контроля, будет оно немедленно записано в браузер или нет).
Итак, короткий ответ: нет гарантированного способа сделать это.
Просто предположите, вы, вероятно, ищете AJAX. Когда люди пытаются манипулировать загрузкой содержимого страницы, как вы это делаете, AJAX почти всегда является правильным путем.
Если вы хотите продолжить задачу в фоновом режиме, вы можете использовать ignore_user_abort
, как подробно описано здесь, однако, часто это не оптимальный подход. По сути, вы теряете контроль над этим потоком, и, на мой взгляд, поток веб-сервера - это не то место, где требуется тяжелая обработка.
Я бы попытался извлечь его из Интернета. Это может означать запись в cron или просто запуск фонового процесса изнутри PHP (процесс, который, хотя и запущен изнутри выполнения скрипта, не умрет вместе со скриптом, и скрипт не будет ждать его завершения перед смертью).
Если вы действительно пойдете по этому пути, это будет означать, что вы даже можете создать какую-то систему статусов, если это необходимо. Затем вы можете отслеживать выполнение и периодически сообщать пользователю о ходе выполнения. (Технически вы также можете создать систему состояний с помощью сценария ignore_user_abort
-ed, но мне он не кажется таким чистым.)
person
Corbin
schedule
14.05.2012