LINUX.ORG.RU

apache + php: Как отдать динамический кешированный контент?


0

0

Есть две бредовые идеи и подозрение, что уже все давно реализовано :

1. Типичный алгоритм для генерации динамической html-страницы при помощи php, с кешированием результата, выглядит следующим образом: php скрипт формирует html-страницу, записывает содержимое в кеш (файл), после чего отдает данные. При следующем обращении к этому же самомоу url, если кеш валиден, php просто отдает данные из файла.

Недостаток очевиден: для отдачи кеша страницы -- фактически статического файла -- используется интерпретатор php, в то время как apache (или любой другой web-сервер), могут это делать гораздо шустрее и потребляя меньше памяти.

Идея: сделать так, чтобы php скрипт возвращал apache'у не сам контент, а лишь путь к файлу. А apache, каким-то магическим образом, уже бы сам отдавал данные из этого файла. Какой модуль апача можно использовать?

Смысл в том, чтобы как можно раньше выгружать сеанс php из памяти. Т.е. php-скрипт в этом случае будет заниматься авторизацией пользователя, выбором, проверкой валидности, и формированием кеш-файла при необходимости. После того, как он быстренько отдаст путь к файлу, php-сеанс можно чистить. Основное время (в реальном масшабе) сервер тратит на отдачу данных (если у пользователя еще и медленное соединение...), когда продолжать держать весь сеанс php в памяти нет ни какого смысла..

2. Ответ http-сервера состоит из http-заголовков, пустой строки и собственно данных. Если данные статические, то заголовки будут всегда одни и те же (размер данных, дата модификации, тип контента, кодировка и т.п.).

Идея: для статического контента все заголовки достаточно вычислить один раз в жизни, после чего сохранить в кеш-файл полный дамп ответа сервера (т.е. заголовки, пустую строку и содержимое исходного контента). В этом случае, для генерации ответа, apache'у достаточно выдать ("HTTP/1.0 200 OK\r\nDate: <дата>"), а дальше тупо прочитать файл. Быстрее и проще не бывает. Какой модуль можно использовать?

★★

1. не изобретайте велосипед.

RewriteCond %{REQUEST_URI} ^dir1/mycoolpage\.html$
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(dir1/mycoolpage)\.html$ /coolscript.php?type=$1 [L]

В coolscript.php скрипте пишите в файл dir1/mycoolpage.html и редиректите сами на себя/возвращаете контент клиенту/етс.

Модуль - mod_rewrite =)

2. mod_headers: отдавайте 304 Not Modified и будет счастье.

anonymous
()

>Идея: сделать так, чтобы php скрипт возвращал apache'у не сам контент, а лишь путь к файлу. А apache, каким-то магическим образом, уже бы сам отдавал данные из этого файла. Какой модуль апача можно использовать?

Идея плоха. При работе с PHP отдача контента - это мизер по сравнению с самим вызовом транслятора. Сам оттестируй производительность статического файла, пустого скрипта и скрипта, отдающего файл.

Так что - или отдавай чистую статику, или мирись с падением производительности, или ставь что-нить типа mod_cml под lighttpd, он умеет несложную программную работу c файлами выполнять на быстрой вариации lua, по скорости получается на уровне статики.

KRoN73 ★★★★★
()

посмотри как устроены джанги с пайлонсами при подключении через фастцги, покури, подумай.

phasma ★☆
()
Ответ на: комментарий от KRoN73

> Идея плоха.

Ничего подобного. Как раз вызов интерпретатора мизер по сравнению с временем генерации этим интерпретатором контента современными cms где перелопачиваются сотни килобайт кода. Именно поэтому всякие bitrix итп юзают файловый кэш(правда, в последнем всё не так тривиально с кэшем). И только благодаря полнейшей безграмотности быдлопрогреров включение кэша зачастую даёт очень небольшой прирост производительности и добавляет глюков.

Но есть способ лучше. php/python/whatever кладёт данные в memcached а nginx, если находит данные в кэше, отдаёт их юзеру минуя php вообще.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.