У меня есть довольно большой файл index.php (около 500 КБ), в котором присутствует много логики и запросов к базе данных (а index.php, отправляемый клиенту, составляет около 200 КБ).
Что я хотел бы сделать, это в первую очередь сжать файл с помощью gzip, который я делаю, просто добавив SendOutputFilter
в моем .htaccess
файл. Теперь, поскольку файл достаточно велик для обработки на сервере, TTFB может занять некоторое время, и поэтому я хотел бы отправить пользователю заголовок файла, прежде чем даже смотреть на запрос, чтобы браузер обнаружил изображения, css и js (которые также довольно большие) и начнут загрузку, а не простаивают в ожидании всей обработки index.php на сервере (я хотел бы что-то вроде поиска Google. Он начинает загрузку pngs до загрузки всей страницы) (и страница сжата)).
Я сделал некоторый запрос, и я не мог найти никакого простого решения. Я обнаружил, что либо я отключаю gzip и использую flush, либо использую gzip, но не flush.
Но, как вы можете видеть в моем случае, мне нужны оба, и я знаю, что это можно сделать как-то. Возможно, с некоторыми обходными путями.
Это то, что делают огромные современные веб-сайты, поэтому я хотел бы знать, как это сделать.
К счастью, я был не прав. Даже если GZIP
Прежде чем вы сможете распаковать его, его необходимо полностью загрузить, вам не нужно отправлять только один chunk
, Вы можете отправить несколько отдельных chunks
где каждый кодируется отдельно.
Это означает, что браузеры должны загрузить chunk
один полностью, а затем он может распаковать его и начать анализ html
, Между тем это скачивание chunk
два.
Прогрессивный рендеринг с помощью нескольких промывок хорошая статья, объясняющая, как это работает. Это однако не PHP
обработано, но сервер / apache обработан.
Проверять, выписываться Как заставить PHP генерировать Chunked ответ для PHP
часть, что вам нужно сделать.
Делать GZIP
работа связана с тем, как настроен ваш сервер. ServerFault
Это не относится к проблеме 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 без выполнения
Надеюсь, это поможет вообще.
Насколько я знаю, в Apache нет способа форсировать ранний вывод контента в браузер. Однако это можно сделать из PHP. Обратите внимание, что в PHP выходные буферы могут быть многоуровневыми, поэтому вам может понадобиться ….
while (ob_get_level ()) ob_end_flush ();
Это отправит данные обратно в Apache, не закрывая стандартный вывод. При отсутствии других осложнений, это вызовет частичный ответ браузеру. Но выходной фильтр mod_deflate также буферизует данные — DeflateBufferSize — по умолчанию 8 КБ. Если твой <голова> (NOT YOUR HEADER!) Больше, чем этот размер, он будет находиться в буфере, пока не будет вытеснен большим количеством контента. Вы можете уменьшить размер буфера и заполнить свой контент, чтобы заполнить его — на практике вы должны использовать оба метода.
Поскольку другие люди говорили, что это невозможно (это не так — попробуйте) и описывали использование Ajax для загрузки страницы, вы можете взглянуть на PJAX. Есть большие Adavantages чтобы использовать это на очень тяжелом сайте JavaScript.