Что лучший способ состоит в том, чтобы сделать кэширование вывода серверной стороны в PHP?

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

  • Поместите его в APC с apc_store($page, 60*60*) - Я чувствую, что это не то, для чего APC и будет, вероятно, делать что-то плохо к другим частям моего сайта
  • Сохраните вывод к файловой системе где-нибудь - Затем, апачу нужен доступ для записи где-нибудь, который мог бы быть болью
  • Так или иначе установите апача, чтобы сделать кэширование для меня - действительно ли это возможно?
6
задан Paul Tarjan 5 February 2010 в 10:12
поделиться

5 ответов

Я немного изменил ответ Роулфа и Джамителина .

Создайте 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: /");

И затем cronjob:

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

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

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

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

1
ответ дан 17 December 2019 в 04:46
поделиться

Простейшие шаги:

http://maven.apache.org/download.html#Installation

Вы упомянули некоторые шаги на сайте Apache. Это та страница, на которую вы смотрели? С каким шагом у вас возникли проблемы?

-121--3113815-

Установка Maven действительно проста: Загрузите ЗАСТЕЖКУ -МОЛНИЮ с сайта, распакуйте его в любом каталоге вашего жесткого диска, а затем просто добавьте каталог bin/ в системную переменную PATH Windows. Таким образом, вы сможете выполнить команду mvn... из любого другого каталога.

-121--3113816-

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

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

1
ответ дан 17 December 2019 в 04:46
поделиться

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

Еще один хороший вариант заключается в настройке сервера кэша Squid .

0
ответ дан 17 December 2019 в 04:46
поделиться

JavaCC - «компилятор-компилятор» (генератор синтаксического анализатора) для Java. Для него существует множество грамматических файлов, в том числе один для Java 1.5.

-121--1090282-

Во-первых, массив должен быть достаточно большим для хранения последовательности:

 unsigned char m_Test[20];

, затем используется strcpy. Вы должны привести первый параметр, чтобы избежать предупреждения:

 strcpy( (char*) m_Test, "Hello World" );

Или если вы хотите быть пуристом C++:

 strcpy( static_cast <char*>( m_Test ), "Hello World" );

Если вы хотите инициализировать последовательность, а не назначить ее, вы также можете сказать:

 unsigned char m_Test[20] = "Hello World";
-121--2496137-
  1. Когда посетитель попадет на вашу страницу, создать содержимое, отправить его пользователю и сохранить статический файл где-то на диске.
  2. Когда придет следующий посетитель, сначала найдите сохраненный файл и, если он существует, не выполняйте весь код в файле index.php. Базовым примером может быть

     if (file_exists ($ cacheFileName))
    {
    требуется $ cacheFileName;
    выход;
    }
    
    //Далее приводится остальная часть кода index.php
    //..
    
    //предполагая, что ваш выход буферизирован и содержится в $ output:
    эхо $ выход;
    
    $ cacheFileName = '/path/to/your/file.inc ';
    file_put_contents ($ cacheFileName, $ output);
    
  3. Набор cron-задания, которое будет удалено сохраненный файл кэша с диска каждый час или так часто, как вам нужно кому. Кроме того, в index.php на каждой странице проверьте, как давно был создан кэшированный файл, и создайте новый файл кэша, если он был длиннее, чем нужно. Задание cron проще настроить.

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

3
ответ дан 17 December 2019 в 04:46
поделиться

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

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

0
ответ дан 17 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: