ob_start和call_user_func不能一起工作

时间:2014-03-19 14:15:46

标签: php

我为我的网站创建了一个简单的缓存系统,但我遇到了一个奇怪的问题。当我在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_startcall_user_fun做错了或这是一个真正的问题?

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

显然,这是PHP 5.2中的一个已知问题。我已经要求我的托管服务将其更新为5.4,问题已经解决。