Периодически заполнять данные представления с запросом - PullRequest
0 голосов
/ 02 декабря 2011

Я пишу представление, в котором будут данные ежедневного / еженедельного / ежемесячного отчета.Я думаю, что имеет смысл периодически выполнять запрос только для обновления данных, а не попадать в базу данных всякий раз, когда кто-то загружает страницу.Можно ли это сделать полностью в PHP и MySQL?Какие надежные способы справиться с этим?

Ответы [ 4 ]

1 голос
/ 02 декабря 2011

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

Пример кода:

$cacheTime = 900; // 15 minutes
$useCache = false;
$cacheFile = './cache/twitter.cachefile';
// check time
if(file_exists($cacheFile)){
    $cacheContents = file_get_contents($cacheFile);
  if((date('U')-filemtime($cacheFile))<$cacheTime || filesize($cacheFile)==0){
    $useCache = true;
  }
}
if(!$useCache){
  // get all your update data setting $cacheContents to the file output. I'd imagine using a buffer here would be a good idea.

  // update cache file contents
  $fh = fopen($cacheFile, 'w+');
  fwrite($fh, $cacheContents);
  fclose($fh);
}

echo $cacheContents;
1 голос
/ 02 декабря 2011

Да, но не очень хорошо.Вы хотите изучить задания Cron, большинство веб-хостов предоставляют сервис для настройки Cron.Это просто способ запуска скрипта, любого скрипта, PHP, Javascript, целой страницы и т. Д.

Поиском в Google вакансий cron, вы должны найти то, что ищете.

Если ваш веб-хостинг не предоставляет задания cron и вы не знаете, как работают команды Unix, то есть сайты, на которых будет размещаться задание cron.

Выезд

http://www.cronjobs.org/

1 голос
/ 02 декабря 2011

Я думаю, что имеет смысл периодически запускать запрос для обновления данных, а не попадать в базу данных всякий раз, когда кто-то загружает страницу

Лично я бы пошел с обоими.например,

SELECT customer, COUNT(orders.id), SUM(order_lines.value)
FROM orders, order_lines
WHERE orders.id=order_lines.order_id
AND orders.placed>@last_time_data_snapshotted
AND orders.customer=@some_user
GROUP BY customer
UNION
SELECT user, SUM(rollup.orders), SUM(rollup.order_value)
FROM rollup
WHERE rollup.last_order_date<@last_time_data_snapshotted
AND rollup.customer=@some_user
GROUP BY customer

, а не попадать в базу данных каждый раз, когда кто-то загружает страницу

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

1 голос
/ 02 декабря 2011

Используя механизм шаблонов, такой как Smarty , который поддерживает кэширование, вы можете установить длительное время кэширования для этих страниц. Затем вам нужно кодировать свой PHP, чтобы проверить, изменились ли ваши ограничения даты и если данные еще не кэшированы, и если какое-либо из этих условий выполняется, выполните запрос. В противном случае Smarty просто загрузит кэшированную страницу, и ваш код не будет запрашивать базу данных.

$smarty = new Smarty();
if (!$smarty->isCached('yourtemplate.tpl')) {
  // Run your query and populate template variables
}
$smarty->display('yourtemplate.tpl');

Дополнительная документация по кешированию Smarty

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...