apache — Как согласовать сжатие gzip и сброс заголовка index.Stack Overflow

У меня есть довольно большой файл index.php (около 500 КБ), в котором присутствует много логики и запросов к базе данных (а index.php, отправляемый клиенту, составляет около 200 КБ).
Что я хотел бы сделать, это в первую очередь сжать файл с помощью gzip, который я делаю, просто добавив SendOutputFilter в моем .htaccess файл. Теперь, поскольку файл достаточно велик для обработки на сервере, TTFB может занять некоторое время, и поэтому я хотел бы отправить пользователю заголовок файла, прежде чем даже смотреть на запрос, чтобы браузер обнаружил изображения, css и js (которые также довольно большие) и начнут загрузку, а не простаивают в ожидании всей обработки index.php на сервере (я хотел бы что-то вроде поиска Google. Он начинает загрузку pngs до загрузки всей страницы) (и страница сжата)).
Я сделал некоторый запрос, и я не мог найти никакого простого решения. Я обнаружил, что либо я отключаю gzip и использую flush, либо использую gzip, но не flush.
Но, как вы можете видеть в моем случае, мне нужны оба, и я знаю, что это можно сделать как-то. Возможно, с некоторыми обходными путями.
Это то, что делают огромные современные веб-сайты, поэтому я хотел бы знать, как это сделать.

0

Решение

К счастью, я был не прав. Даже если GZIP Прежде чем вы сможете распаковать его, его необходимо полностью загрузить, вам не нужно отправлять только один chunk, Вы можете отправить несколько отдельных chunksгде каждый кодируется отдельно.

Это означает, что браузеры должны загрузить chunk один полностью, а затем он может распаковать его и начать анализ html, Между тем это скачивание chunk два.

Прогрессивный рендеринг с помощью нескольких промывок хорошая статья, объясняющая, как это работает. Это однако не PHP обработано, но сервер / apache обработан.

Проверять, выписываться Как заставить PHP генерировать Chunked ответ для PHP часть, что вам нужно сделать.

Делать GZIP работа связана с тем, как настроен ваш сервер. ServerFault

1

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

Это не относится к проблеме GZIP и flush, а скорее к сценариям PHP и дизайну страниц, разработанным специально для вашего вопроса о предварительной загрузке CSS, HTML и т. Д.

Возможно, вы захотите разделить рабочую нагрузку index.php между двумя сценариями, сначала загрузив html для отображения, а затем запрашивая «более тяжелые» задачи асинхронно с использованием ajax, а затем обновляя части экрана.
Это позволит CSS и всем остальным сначала выполнять свою работу, а затем выполнять более длительные задачи, чтобы позже показывать свои результаты.

Для этого начнем с «легковесного» файла index.php с базовым HTML-кодом веб-страницы и логикой отображения, например, с событием / триггером $(window).load(function(){ //ajax call to heavier heavy_index.php script and screen updating from response }) что позволило бы странице полностью отобразиться, а затем, после загрузки, вызвать более тяжелые вещи.

Это дает быстрый пример:

index.php

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="/my_css.css">

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">

$(window).load(

function () {
alert("About to load more content");

$.ajax({
url: "/heavy_index.php",
success: function (html_data) {
$("#content_loaded_later").html(html_data);
}
});
});

</script>
</head>

<body>
<div class='content_initial'  ><span>Content initially loaded</span></div>
<div class='content_later' id='content_loaded_later'>loading...</div>
</body>
</html>

heavy_index.php

<?php
echo "resulting content from heavier workload";
?>

my_css.css

.content_initial
{
border:1px solid red; width:120px; height:120px;
margin:10px;
}

.content_later
{
border:1px solid green; width:120px; height:120px;
margin:10px;
}

Вы также можете посмотреть на этот пост Предварительная загрузка CSS / Javascript без выполнения

Надеюсь, это поможет вообще.

1

Насколько я знаю, в Apache нет способа форсировать ранний вывод контента в браузер. Однако это можно сделать из PHP. Обратите внимание, что в PHP выходные буферы могут быть многоуровневыми, поэтому вам может понадобиться ….

while (ob_get_level ()) ob_end_flush ();

Это отправит данные обратно в Apache, не закрывая стандартный вывод. При отсутствии других осложнений, это вызовет частичный ответ браузеру. Но выходной фильтр mod_deflate также буферизует данные — DeflateBufferSize — по умолчанию 8 КБ. Если твой <голова> (NOT YOUR HEADER!) Больше, чем этот размер, он будет находиться в буфере, пока не будет вытеснен большим количеством контента. Вы можете уменьшить размер буфера и заполнить свой контент, чтобы заполнить его — на практике вы должны использовать оба метода.

Поскольку другие люди говорили, что это невозможно (это не так — попробуйте) и описывали использование Ajax для загрузки страницы, вы можете взглянуть на PJAX. Есть большие Adavantages чтобы использовать это на очень тяжелом сайте JavaScript.

0
По вопросам рекламы [email protected]