Ответ 1
Работа с огромными или многими вспомогательными файлами с PHP не совсем то, для чего он сделан.
Вместо этого просмотрите X-accel для nginx, X-Sendfile для Lighttpd или mod_xsendfile для Apache.
Исходный запрос обрабатывается PHP, но как только файл загрузки был определен, он устанавливает несколько заголовков, чтобы указать, что сервер должен обрабатывать отправку файла, после чего процесс PHP освобождается, чтобы обслуживать что-то еще.
Затем вы можете использовать веб-сервер для настройки кэширования для вас.
Статический контент
Если ваш контент сгенерирован с PHP и особенно дорог для создания, вы можете записать вывод в локальный файл и снова применить вышеуказанный метод.
Если вы не можете писать в локальный файл или не хотите, вы можете использовать заголовки ответов HTTP для управления кешированием:
Expires: <absolute date in the future>
Cache-Control: public, max-age=<relative time in seconds since request>
Это приведет к тому, что клиенты будут кэшировать содержимое страницы до истечения срока ее действия или когда пользователь заставляет перезагружать страницу (например, нажмите F5).
Динамически сгенерированный контент
Для динамического контента, который вы хотите, чтобы браузер выполнял ping вы каждый раз, но только отправляйте содержимое страницы, если что-то новое. Вы можете выполнить это, установив несколько других заголовков ответов:
ETag: <hash of the contents>
Last-Modified: <absolute date of last contents change>
Когда браузер снова запустит ваш script, они добавят следующие заголовки запросов соответственно:
If-None-Match: <hash of the contents that you sent last time>
If-Modified-Since: <absolute date of last contents change>
ETag
в основном используется для снижения сетевого трафика, как и в некоторых случаях, чтобы знать хэш содержимого, вам сначала нужно его вычислить.
Last-Modified
проще всего применять, если у вас есть локальные файловые кэши (файлы имеют дату модификации). Простое условие заставляет его работать:
if (!file_exists('cache.txt') ||
filemtime('cache.txt') > strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
// update cache file and send back contents as usual (+ cache headers)
} else {
header('HTTP/1.0 304 Not modified');
}
Если вы не можете делать файловые кэши, вы все равно можете использовать ETag
, чтобы определить, изменилось ли содержимое между тем.