zend framework отключить вывод для захвата

#php #zend-framework

#php #zend-framework

Вопрос:

Мне нужно запустить обработку закрытия после подключения (отправка электронных писем, обновление кэшей и т. Д.), Что занимает много времени. Итак, для того, чтобы сделать это, у меня есть помощник по действию, который в конечном итоге будет проверять, нужно ли что-то делать, и обрабатывать это.

Вот упрощенная версия выходного бита:

 $this->getFrontController()->returnResponse(false);
$response = $this->getResponse();
$body = $response->getBody();
$response->setHeader('Connection', 'close');
ob_start();
echo $body;
$size = ob_get_length();
$response->setHeader('Content-length', $size);
ob_end_flush();
flush();
$this->run();
  

(Обратите внимание, что в режиме реального времени я намерен использовать fastcgi_finish_request, но это также должно работать локально. $this-> run() запускает функции постобработки, здесь нет вывода).

Я продолжаю получать старую ненавистную ошибку отправки заголовков с этим, но исключение не возвращает номер файла или строки, где это произошло (я предполагаю, что это связано с характером помощников действий в Zend).

При некотором копании ошибка была связана с вызовом setHeader(). Но я думал, что с returnResponse(false) они не будут автоматически отправлять?

Правильна ли моя логика для вывода этого?

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

Другая проблема заключается в том, что getReponse ничего не возвращает, потому что рендеринг макета не был вызван, но вызов Zend_Layout::getMvcInstance()-> render(); дает мне макет без содержимого, отображаемого в $layout-> content ?

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

1. Есть ли у вас какие-либо случайные пробелы за пределами <?php ?> любого из ваших включенных файлов?

2. @jprofitt нет, но, как я уже сказал в вопросе, это происходит из вызова setHeader

Ответ №1:

Я предполагаю, что ob_end_flush() отправляет $body и т. Д. Но $this-> run() пытается отправить заголовки впоследствии. Попробуйте использовать что-то вроде $content = ob_get_contents(); и ob_end_clean(), чтобы сохранить содержимое буфера в переменную и очистить буфер без отправки. Затем вы можете повторить $content после отправки ваших заголовков.