尽可能少地执行一个方法 - PHP

时间:2010-03-07 10:29:33

标签: php optimization

我有一个多种语言的网站。我有一个方法,可以在数组中返回今天的货币。然后我在表格中显示这些货币。

// --- 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/或其他语言时,我都会从外部网站请求汇率。

我可以优化此行为(每天或会话阅读一次)吗?

可能存储全局变量并检查更新日期?

4 个答案:

答案 0 :(得分:3)

您要查找的关键字是 Caching

在您的情况下,我们的想法是只在更新时获取汇率。例如,如果您的脚本是fetching the Exchange Rates from the ECB,则费率会每天更改(大约1400 CET)。没有必要每天多次获取它们。

我能想到的构建缓存的最简单的自定义实现是存储来自Forex调用的结果并将结果序列化到文件。然后,当第二次调用服务时,检查文件的上次修改时间。如果它比例如年龄大,例如24小时,将呼叫发送到外部站点并替换该文件。如果没有,请反序列化内容,而不是调用外部站点。

由于缓存是一个常见的概念,因此可以选择许多实现,例如APCmemcached和抽象层,如Zend_Cache,PEAR的Cache或{ {3}}。 Smarty也可以使用您的外汇服务缓存任何模板,但个人CacheLite

另见相关问题:

答案 1 :(得分:1)

将结果存储在数据库中,根据需要随时调用cron作业中的脚本..每天,每小时,任何让你开心的事。

答案 2 :(得分:1)

所有变量都以脚本(全局或本地)消亡,不能用于缓存目的。

根据您的资源,您有多种解决方案:

  • 您可以选择汇率serialize作为字符串并将其存储到文件中。当您需要打印它们时,请阅读file modification time;如果它早于X,则从外部服务器获取新数据,否则unserialize显示当前数据并显示它。

  • 当然,您可以将原始数据存储在适当的SQL数据库中并定期更新。

答案 3 :(得分:0)

这可以是像Smarty这样的良好模板引擎的一个优点。 Smarty允许您有效地缓存页面的某些部分,无论您喜欢什么时间间隔,它都将为您处理。

其他模板引擎可能会有相似之处,你当然可以自己做。

但首先你应该问:这实际上是一个问题吗?时间渲染需要多长时间。如果这是一个真正的问题,我会感到惊讶,但这取决于它获取信息的位置以及负载的实现方式。

或者,如果它们来自不可靠的东西(例如Web服务),您可能希望从外部脚本加载它们并将它们存储在内存缓存(例如memcached)中或仅存储在数据库中。 / p>