2010-03-07 2 views
0

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

// --- en/index.php 
<?php 
include_once "../exchangeRates.php"; 
$currencies = ReadExchangeRates(); 

// --- fr/index.php 
<?php 
include_once "../exchangeRates.php"; 
$currencies = ReadExchangeRates(); 

... 
// somewhere in the page 
<td><?php echo $currencies["eur"]["today"]; ?></td> 

Таким образом, каждый раз, когда я загружаю, en/ или fr/ или другой язык, я прошу обменных курсов с внешнего сайта.

Могу ли я оптимизировать это поведение (чтение один раз в день или сеанс)?

Возможно, для хранения глобальной переменной и проверки даты обновления?

ответ

1

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

У вас есть несколько решений, в зависимости от ваших ресурсов:

  • Вы можете выбрать курсы обмена, serialize их в виде строки и сохранить его в файл. Когда вам нужно распечатать их, прочитайте file modification time; если он старше X, извлекайте свежие данные с внешнего сервера, иначе unserialize ваши текущие данные и отобразите их.

  • И, конечно же, вы можете просто хранить необработанные данные в соответствующей базе данных SQL и регулярно обновлять их.

1

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

0

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

Другие шаблонные двигатели, вероятно, будут похожи, и вы можете, конечно, сделать это сами.

Но сначала вы должны спросить: это на самом деле проблема? Время, необходимое для рендеринга. Я действительно был бы удивлен, если это настоящая проблема, но это зависит от того, где она получает эту информацию и как реализуется загрузка.

В качестве альтернативы, если они исходят из чего-то ненадежного (например, веб-службы), вы можете загрузить их из внешнего скрипта и сохранить их в кеше в памяти (например, memcached) или просто в базе данных.

+0

Как вы можете видеть из вопроса, я начинающий PHP, поэтому я сомневаюсь в реализации «Smarty» или подобных вещей. – serhio

3

Ключевое слово вы ищете Caching.

В вашем случае идея заключается в том, чтобы получать обменные курсы только так часто, как они обновляются. Если, например, ваш скрипт fetching the Exchange Rates from the ECB, то ставки меняются ежедневно (около 1400 CET). Нет необходимости получать их более одного раза в день.

Простейшая пользовательская реализация, которую я могу придумать для создания кеша, заключается в том, чтобы сохранить результат от вызова Forex и сериализовать результат в файл. Затем, когда выполняется второй вызов службы, проверьте последнее измененное время файла. Если он больше, чем, например, 24 часа, отправьте вызов на внешний сайт и замените файл. Если нет, несериализуйте содержимое вместо вызова внешнего сайта.

С кэшированием является общим понятием, существует ряд реализаций, чтобы выбрать из, как APC, memcached и уровней абстракции, как Zend_Cache, в PEAR Cache или CacheLite. Smarty может кэшировать любые шаблоны, используя ваш Forex-сервис, но лично I feel Smarty's time is over.

Также см этого родственный вопрос:

Смежные вопросы