我为我的网站创建了一个简单的缓存系统,但我遇到了一个奇怪的问题。当我在call_user_func
之后立即致电ob_start
时,它未被正确捕获并停止执行。
这是我的缓存类代码:
<?php
class Cache
{
public static function caching($name, $callback, $duration = 120, $debug = true)
{
if ($debug) $start_time = microtime(true);
// Compute file name
$cache = 'cache' . DIRECTORY_SEPARATOR . $name .'_' . md5(join('-', $_POST)) . '.cache';
$expire = time() - $duration;
if(file_exists($cache))
{
if (filemtime($cache) > $expire)
{
// Display content saved into the cache file
readfile($cache);
if ($debug) echo '<br />' . (microtime(true) - $start_time * 1000) . 'microseconds';
return;
}
else
{
// File is too old so we can delete it
unlink($cache);
}
}
// Init buffer
ob_start();
// Do job
if (function_exists($callback)) call_user_func($callback);
else echo 'Function ' .$callback. ' doesn\'t exist.';
// Retrieve buffer
$page = ob_get_contents();
ob_end_clean();
// Save buffer to a cache file
file_put_contents($cache, $page);
// Display content
echo $page;
if ($debug) echo '<br />' . (microtime(true) - $start_time * 1000) . 'microseconds';
}
}
以下是我的示例代码:
<?php
require('cache.class.php');
function run()
{
if (isset($_GET['sid']))
{
$sid = htmlentities($_GET['sid']);
echo 'sid is ' . $sid;
}
}
Cache::caching('Sample', 'run');
die();
因此,当它被调用时显示sid id XXXXX
,但它在caching
方法中没有进一步展开。永远不会到达$page = ob_get_contents();
行,我也没有任何错误消息。
我是否使用ob_start
和call_user_fun
做错了或这是一个真正的问题?
答案 0 :(得分:0)
回答我自己的问题:
显然,这是PHP 5.2
中的一个已知问题。我已经要求我的托管服务将其更新为5.4
,问题已经解决。