缓存包括在PHP中用于迭代重用

时间:2011-06-23 09:10:01

标签: php caching include eval

有没有办法有效地缓存PHP include以便重用,没有APC,等等?

简单(虽然是愚蠢的)示例:

// rand.php
return rand(0, 999);

// index.php
$file = 'rand.php';
while($i++ < 1000){
    echo include($file);
}

同样,虽然荒谬,但这对脚本会转储1000个随机数。但是,对于每次迭代,PHP都必须访问文件系统(正确?没有我遗漏的继承缓存功能,是吗?

基本上,如何防止前一个场景导致文件系统的1000次点击?

我到目前为止唯一考虑的是一个傻瓜,它可能根本没有效果(没有测试过,在这里写过,容易出错,但是你明白了这个想法):

// rand.php
return rand(0, 999);

// index.php
$file = 'rand.php';
$cache = array();
while($i++ < 1000){
    if(isset($cache[$file])){
        echo eval('?>' . $cache[$file] . '<?php;');
    }else{
        $cache[$file] = file_get_contents($file);
        echo include($file);
    }
}

一个更现实,更不愚蠢的例子:

当包含用于生成视图的文件时,给定视图文件在给定请求中使用多次(小部件或其他东西)是否有一种实际的方法来捕获和重新评估视图没有文件系统命中的脚本?

4 个答案:

答案 0 :(得分:5)

如果通过网络访问包含文件,这只会有意义。

  

我没有遗漏任何继承缓存功能,是吗?

所有操作系统都经过高度优化,可以减少物理I / O的数量并加快文件操作。在大多数情况下,在正确配置的系统上,系统很少会恢复到磁盘以获取PHP代码。坐下来用电子表格思考如果必须从磁盘中提取每个文件需要多长时间来处理PHP代码 - 这是荒谬的,例如假设您的脚本位于/var/www/htdocs/index.php中并包含/usr/local/php/resource.inc.php - 那就是8个寻找操作来定位文件 - 每个@ 8ms,找到文件的时间是64ms !在你的测试用例上运行一些时间 - 你会发现它运行得比这快得多。

答案 1 :(得分:1)

与Sabeen Malik的回答一样,您可以使用输出缓冲来捕获包含的输出,然后将它们连接在一起,然后将其保存到文件中,并且每次都包含一个文件。

这个集体包含可以通过检查文件的模式时间保留一个小时,然后重写并重新包括每小时一次的包含。

答案 2 :(得分:0)

我认为更好的设计会是这样的:

// rand.php
function get_rand() {
    return rand(0, 999);
}

// index.php
$file = 'rand.php';
include($file);

while($i++ < 1000){
    echo get_rand();
}

答案 3 :(得分:0)

另一种选择:

while($i++ < 1000) echo rand(0, 999);