如何在PHP中缓存代码?

时间:2011-03-06 15:04:18

标签: php parsing caching

我正在创建一个自定义表单构建系统,其中包含各种令牌。使用正则表达式找到这些标记,并根据toke的类型进行解析。有些需要简单的替换,有些需要循环,等等。

现在我知道,RegExp非常耗费资源和时间,因此我希望能够解析一次表单的代码,创建一个php代码,然后保存PHP代码,以供下次使用。我该怎么做呢?

到目前为止,我只看到了输出缓存。有没有办法缓存像echo这样的命令和像foreach()这样的循环?


由于误解,我将创建一个例子。

未分析的模板数据:

Thank You for Your interest, [*Title*] [*Firstname*] [*Lastname*]. Here are the details of Your order!
[*KeyValuePairs*]
Here is the link to Your request: [*LinkToRequest*].

解析模板:

"Thank You for Your interest, <?php echo $data->title;?> <?php echo $data->firstname;?> <?php echo $data->lastname;?>. Here are the details of Your order!
 <?php foreach($data->values as $key=>$value){
echo $key."-".$value
}?>
  Here is the link to Your request: <?php echo $data->linkToRequest;?>.

然后我会保存解析后的模板,而不是每次解析模板,只需将$data变量传递给已经解析的变量,这将生成输出。

3 个答案:

答案 0 :(得分:2)

您只需生成包含的文件,将其保存在不可公开访问的文件夹中,并使用include($ filename)包含在PHP函数内;

代码示例:

    function render( $___template, $___data_array = array() )
    {
            ob_start();
            extract( $___data_array );
            include ( $___template);
            $output = ob_get_clean();
            echo $output;
    }   
    $data = array('Title' => 'My title', 'FirstName' => 'John');
    render('templates/mytemplate.php', $data);

注意关键点是使用extract(http://php.net/extract)来扩展真实变量中的数组内容。

(在函数$ ___ data ['FirstName']范围内变为$ FirstName)

更新:这大致是Wordpress,CodeIgniter和其他框架用来加载基于PHP的模板的方法。

答案 1 :(得分:1)

我不确定是否了解您的问题,但您是否尝试使用APC

使用APC,您可以缓存变量,因此如果您回显特定变量,您可以从缓存中获取它。

您执行所有计算,将信息保存在某些变量中,并将这些变量保存在缓存中。然后,下次你从缓存中获取该信息。

使用APC非常简单。您只需致电apc_fetch($key)进行提取,然后apc_store($key, $value, $howLongYouWant2Cache)进行保存即可。

答案 2 :(得分:1)

最好的办法就是简单地生成一个PHP文件并保存。即,

$replacement = 'foobar';

$phpCodeTemplate = "<?php echo '$replacement'; ?>";

file_put_contents('some_unique_file_name.php', $phpCodeTemplate);

动态生成PHP文件时要非常小心,因为您不希望允许用户操纵数据以包含任何恶意内容。

然后,在您的过程中,只需检查文件是否存在,是这样,运行它,否则生成文件。