#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 после отправки ваших заголовков.