使用opcache在PHP中缓存静态数据

时间:2014-04-19 11:29:29

标签: php opcache

我需要在PHP网站的每个网页上提供约100个字符串变量。数据在运行时永远不会改变,但将来我将需要多组数据并在用于页面请求的数据集之间切换。字符串的长度从5到600个字符不等。我目前正在包含一个包含如下数据的文件:

$someStuff = "abc";
$otherStuff = "def";
// etc

我正在使用opcache。这种方法可以从opcache中获益多少?

我见过this answer。如果缓存的好处值得进行密钥查找,我可以改为使用关联数组。但是,我不清楚使用带有静态数组字段的类对于我的情况比声明变量更好。

也许带静态变量的函数是个好主意?这与静态类字段相同,更好还是更差?

function getItem ($name) {
    static $items = array("someStuff" => "abc");
    return $items[$name];
}

对于每个字符串,可能是函数而不是变量?如果并非所有字符串都用于给定页面(通常是这种情况),这会更好吗?

function someStuff () { return "abc"; }
function otherStuff () { return "def"; }

什么是最佳解决方案?每个页面都需要这些数据,所以我希望尽可能高效,避免从磁盘/数据库中读取等。

1 个答案:

答案 0 :(得分:2)

在实践中,你是否做了类似的事情没有区别:

$someStuff = "abc";
$otherStuff = "def";
// ...

$constants = array(
    'someStuff' => "abc";
    'otherStuff' = >"def";
    // ...
);

或根据我的其他答案将其包装到类中的静态数组中。使用OPcache将删除编译开销和磁盘I / O开销。它将实现字符串常量,以便Zend引擎可以有效地静态使用它们。类版本执行数组结构的单个浅拷贝,另外两个版本将执行约200个操作码执行以初始化~100个变量,并且实际实习的字符串再次通过引用有效复制。引擎通常每秒解释20-40M操作码执行程序,所以算一算:它并不重要。

我的建议是:不要担心这里的运行时问题,只需选择您认为最清晰,最易维护的方法。就个人而言,我会使用自己的配置类文件中自动加载的类,但这是你的应用程序,并为你做最清楚的事情。

BTW,使用函数很乱,它们确实有运行时成本,函数调用是最昂贵的PHP操作之一。对类常量的引用要便宜得多,但请自己尝试对这些进行基准测试。但是,除非您指的是每次请求10k +次,否则您不会注意到重大差异。过于聪明只会最终导致你自己摔倒在脚下。" :-)