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


caching static data in PHP with opcache

我有大约100个字符串变量,这些变量需要在PHP网站的每个网页上都可用。数据在运行时永远不会改变,尽管将来我需要多组数据,并在用于页面请求的数据之间切换。字符串的长度从5个字符到600个字符不等。我目前正在包括一个文件,其中的数据如下:

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

我正在使用操作缓存。这种方法将从opcache中受益多少?

我看到了这个答案。如果缓存的好处值得进行键查找,我可以改为使用关联数组。然而,我不清楚使用带有静态数组字段的类是否比声明变量更适合我的情况。

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

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

也许每个字符串都有一个函数而不是一个变量?如果不是所有的字符串都用于给定的页面(通常是这样),这会更好吗?

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

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

在实践中,是否执行以下操作没有区别:

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

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

或者按照我的另一个答案将其封装到类中的静态数组中。使用OPcache将消除编译开销和磁盘I/O开销。它将插入字符串常量,以便Zend引擎可以有效地静态使用这些常量。类版本对数组结构进行一次浅层复制,另外两个版本将执行约200个操作码来初始化约100个变量,并且通过引用有效地复制实际的内部字符串。引擎通常每秒解释20-40M个操作码执行,所以计算一下:这无关紧要。

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

顺便说一句,使用函数很麻烦,而且它们确实有运行时成本,函数调用是最昂贵的PHP操作之一。对类常量的引用要便宜得多,但请尝试自己对这些常量进行基准测试。然而,同样,除非你每次请求都提到这10k多次,否则你不会注意到实质性的差异。太聪明只会让你"射中自己的脚"。:-)