Каков наилучший способ кэширования вывода на стороне сервера в PHP? - PullRequest
6 голосов
/ 05 февраля 2010

У меня сейчас довольно сложный index.php, и я хотел бы запускать его только один раз в час. Каков наилучший способ достичь этого? Некоторые идеи у меня были

  • Поместите его в APC с apc_store($page, 60*60*) - я чувствую, что это не то, для чего нужен APC и, вероятно, будет делать что-то плохое для других частей моего сайта
  • Сохраните вывод в файловой системе где-то - тогда apache нужен доступ на запись куда-нибудь, что может быть проблемой
  • Каким-то образом настройте apache, чтобы выполнить кеширование для меня - возможно ли это?

Ответы [ 5 ]

3 голосов
/ 05 февраля 2010
  1. Когда посетитель заходит на вашу страницу, генерирует контент, отправляет его пользователю и сохраняет статический файл где-то на диске.
  2. Когда приходит следующий посетитель, сначала найдите сохраненный файл и, если он существует, обслужите его, а не выполняйте весь код в вашем файле index.php. Базовый пример будет

    if (file_exists($cacheFileName))
    {
        require $cacheFileName;
        exit;
    }
    
    // here goes the rest of your index.php code
    //..
    
    // assuming your output is buffered and is contained in $output:
    echo $output;
    
    $cacheFileName = '/path/to/your/file.inc';
    file_put_contents($cacheFileName, $output);
    
  3. Настройка задания cron, которое будет удалять сохраненный файл кеша с диска каждый час или так часто, как вам нужно к. В качестве альтернативы, в вашем index.php, на каждой странице нажимайте, как давно был создан кэшированный файл, и сгенерируйте новый файл кэша, если он был дольше, чем вы хотели бы. Задание cron проще в настройке.

Однако, чтобы ответить на глубокий философский вопрос, сохранение сгенерированного вывода на диск в отдельных файлах, вероятно, является лучшим способом, если вы не хотите полагаться на сторонние решения для кэширования. APC хорош для кэширования кода, который будет восстанавливать страницы при необходимости, и memcached определенно излишним, если мы говорим о небольшом (ish) приложении.

1 голос
/ 26 марта 2010

Я пошел с небольшим изменением на Rowlf's и jamietelin ответить.

Создать 3 файла:

index.html

<meta http-equiv="refresh" content="0;url=/index_update.php" />

index.php

<?php // do all your normal stuff ?>

index_update.php

<?php

$file = "index.html";
$time = 60 * 10 - (time() - filemtime($file));

# this is on the first install 
if (filemtime($file) != filectime($file))
    $time = 0;

if ($time > 0) {
    die("Data was already updated in the 10 minutes. Please wait another " . ($time) . " seconds.");
}

ob_start();
require "index.php";
$data = ob_get_contents();

$fp = fopen($file, "w");
fwrite($fp, $data);
fclose($fp);

header("Location: /");

А потом кронхоб:

*/15 * * * * curl http://example.com/index_update.php

Итак, если кто-то споткнется на странице после производственного нажатия, он просто прозрачно создаст для вас новый index.html, иначе ваш cronjob будет делать это каждые 15 минут.

Просто убедитесь, что index.html доступен для записи на вашем сервере Apache. Если это звучит страшно, то просто заставьте ваш cronjob запускать php index_update.php от имени другого пользователя с правами на запись в index.html . У вас не будет доступа ко всей среде apache.

Надеюсь, это поможет, комментарии приветствуются.

1 голос
/ 05 февраля 2010

Доставка статических страниц всегда самый оптимизированный способ. Так, например, используйте Cron или любую другую службу планирования по вашему выбору, чтобы генерировать статическую версию вашего индекса один раз в час и записывать его в файл, например index.html. Вы можете даже сгенерировать его как .php, если вам все еще нужны динамические части в индексе.

Я бы сказал, что это абсолютно лучший способ. Конечно, обрабатывать настройку chmod для файла не так-то просто, но это не такая большая проблема.

0 голосов
/ 05 февраля 2010

Сохраните страницу в статический файл и используйте правила .htaccess для обслуживания статической страницы.

Я не уверен в точных деталях, но я думаю, что codeignitor и boost для drupal делают это.

0 голосов
/ 05 февраля 2010

Вы действительно должны взглянуть на Memcached (отличная php поддержка.)

Другим хорошим вариантом является настройка Squid Cache Server .

...