Очистка буфера после рендеринга заголовка страницы в Zend Framework

В нашем приложении много тегов CSS и JS в заголовке и в целях улучшения воспринимаемой скорости загрузки страницы, Я хотел, чтобы страница начала извлекать внешний контент как можно скорее, даже в ожидании, пока другой контент будет обслуживаться сервером. По сути, моя цель состояла в том, чтобы браузер начал загружать CSS и JS из тега head, пока он ждал доставки содержимого тела.

Итак, на главной странице макета я попытался очистить буфер после визуализации тега head (output_buffering был отключен в php.ini):

<?php ob_start(); ?>
<head>
<?php
// A bunch of function calls to render tags for external style sheets and JS
?>
</head>
<?php ob_end_flush(); ?>
<body>
Body content rendered here . . .
</body>

Это не имело никакого эффекта. Когда я посмотрел на сетевую активность в Chrome, то увидел, что тег head и тег body были доставлены в одном ответе, и только после завершения загрузки другие ресурсы начали загружаться последовательно, а не параллельно, как я ожидал.

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

Я даже пытался использовать только вызов flush () между тегами head и body, но это вызвало ошибку, сообщающую мне, что я пытаюсь изменить заголовки после того, как они уже были отправлены, так что ничего полезного для меня не принесло , или.

Затем я попытался выяснить, существует ли решение, специфичное для Zend Framework. Кто-то сказал мне, что я пытаюсь сделать это невозможно, потому что ZF отображает всю страницу из шаблона в памяти, и поэтому ее нельзя просто сбросить в середине рендеринга и отправить обратно в браузер, а ZF в основном игнорирует конфигурационное значение PHP output_buffering.

Я думаю, что я исчерпал все возможные комбинации функций очистки, поэтому мне было интересно, если у кого-то еще была подобная проблема и каков подход.

Версия сервера: Apache / 2.2.22 (Ubuntu)

(Как примечание: да, я знаю, что JS должен быть загружен внизу страницы, но это был не мой призыв поместить его в тег head)

ОБНОВЛЕНИЕ 1

Я получаю то, что хочу, частично когда я попробую следующее:

<?php ob_start('ob_gzhandler'); ?>
<head>
<?php
// A bunch of function calls to render tags for external style sheets and JS
?>
</head>
<?php ob_end_flush(); ?>
<body>
Body content rendered here . . .
</body>

Я добавил обратный вызов для ob_start в ob_gzhandler. Выполнение этого возвращает ответ, содержащий тег head, без тела. Это хорошо, потому что, как только появляется тег head, ресурсы начинают загружаться, но тег body никогда не появляется и страница в основном пуста. Это все равно, что сказать ему сбросить буфер сброса, но тогда сценарий никогда не сбрасывает снова, когда завершает выполнение.

Я явно добавил вызов ob_flush (и другие варианты) в конец скрипта макета, но они либо ничего не делают, либо жалуются, что нет буфера для сброса (возможно, потому что я вызывал ob_end раньше).

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …