Кеширование PHP-скрипта на остаток дня

Как я могу сделать PHP-скрипт удобным для кеширования нашего частного обратного прокси (Squid)?

Я бы хотел, чтобы он оставался в кеше до конца дня. Другими словами, последняя модификация страницы - 00:00 сегодня, а срок ее действия истечет в 00:00 завтра.

Каковы минимальные необходимые HTTP-заголовки для надежной работы?

Обновлено: я не хочу, чтобы браузер клиента кешировал иначе. То есть я хочу сохранить контроль над очисткой устаревших страниц на нашем сервере Squid в любой момент времени.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
2 852
4

Ответы 4

Я предполагаю, что вы имеете в виду, что хотите кэшировать выход скрипта, а не сам скрипт. И вам явно нужны серверные сценарии, поэтому HTTP-заголовки - это не то, что вам нужно (если нет какой-либо привязки к Squid, что вполне может быть). Но Squid создан не для этого.

Для такого рода вещей вам действительно нужен memcached (или аналогичный).

Проверьте, есть ли результат в кеше. Если это так, верните его. Если нет, сгенерируйте результат (например, используя ob_start () и т. д.), Поместите его в кеш и верните.

вы можете запустить свой скрипт и сгенерировать статические HTML-файлы для обслуживания. Таким образом, вам решать, когда заменять контент.

вам не нужно запускать скрипты внутри веб-сервера. работа cron работает отлично.

Старый пост, но я лично считаю, что это лучший подход в этом случае, если я правильно понимаю вопрос. Если ваша страница генерируется с помощью редких изменяющихся данных ... даже в этом случае, если скрипт удалит последние сгенерированные HTML-страницы, а затем сгенерирует их снова ... Было бы идеально.

Angry 84 05.04.2015 14:53

@OP: Ниже приведен некоторый закомментированный код для достижения того, о чем вы просили.

@cletus: Вы сказали, что memcached - это то, чего хочет OP, и что Squid не для этого предназначен.

Я не знаю, для чего был разработан Squid, но я знаю, для чего он используется является, и определенно есть люди, использующие его в качестве обратного прокси для снятия нагрузки с генерации динамических страниц. Никакой «привязки» не требуется, кроме стандартных заголовков HTTP.

Я не уверен, почему вы так быстро рекомендуете memcached, не зная больше о природе приложения и среды.

<?php

// the time we got hit and generated content
$now = time();
$generatedAt = gmdate('D, d M Y H:i:s T', $now);

// the last modified date (midnight on the same day of generation, as
// per your business-rule)
$lastModified = gmdate('D, d M Y 00:00:00 T', $now);

// date of expiry (24 hours after the last modified date, as per your
// business-rule)
$expiresAt = gmdate('D, d M Y H:i:s T', strtotime($lastModified) + 86400);

// the minimum required http headers to make Squid do what you asked is
// Last-modified and Cache-control.  We need to give Cache-control the
// expiry time in terms of "age" (in seconds) so we calculate that below.
// Optionally you could also provide the "Expires: $expiresAt" header to
// tell the browser/client the same information, just in a different way.
// This is not required for Squid though.
$maxAge = strtotime($expiresAt) - strtotime($generatedAt);
header('Last-modified: ' . $lastModified);
header('Cache-control: max-age=' . $maxAge);

// The rest is simply informational
header('Content-type: text/plain');
echo "The content of this page was last modified at $lastModified\n";
echo "This page was generated at $generatedAt and will be cached by Squid for $maxAge seconds until $expiresAt\n";

// Sample output:
//
// The content of this page was last modified at Tue, 13 Jan 2009 00:00:00 GMT
// This page was generated at Tue, 13 Jan 2009 04:29:33 GMT and will be cached by Squid for 70227 seconds until Wed, 14 Jan 2009 00:00:00 GMT

Вы пробовали использовать APC?

http://us.php.net/apc

The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. It was conceived of to provide a free, open, and robust framework for caching and optimizing PHP intermediate code.

Другие вопросы по теме