3

我一直在研究一些策略来优化我正在研究的 Web 应用程序,特别是与 Web 浏览器缓存和动态数据相关的。由于可能在会话中多次加载相同的动态内容,我想出了以下方法,使用 PHP 的输出缓冲区并使用内容的哈希作为 ETag。

我意识到我用这种方法真正节省的唯一事情是将数据传输回用户,因为 PHP 脚本仍然必须完全运行,但我很好奇是否有人做过类似的事情,是否有任何想法或疑虑我应该知道或有什么其他方法可能更好。

这是我在每页顶部包含的代码:

<?php
function hash_buffer($content) {
    $buffer_hash = crc32($content);
    if ($_SERVER['HTTP_IF_NONE_MATCH'] == $buffer_hash) {
        header('HTTP/1.1 304 Not Modified');
        header("ETag: $buffer_hash");
        return '';
    }
    header('Cache-Control: private, no-cache');
    header("ETag: $buffer_hash");
    return $content;
}

ob_start('hash_buffer');
?>
4

1 回答 1

0

使用快速的东西来创建哈希 crc32 速度很快,但可能会比 md5 给你更多的冲突(尽管文件名会处理一些问题)。

<?php
function hash_buffer($content) {
    $buffer_hash = crc32($content);

    // You could add expire time so the check is not made every time.
    // Or force it to happen always
    header('Expires:');//.date('r',strtotime('+1 hour')));

    // Add vary header so client knows to usee ETag
    // Without overwriting existing vary headers
    header('Vary: If-None-Match',false);

    if ($_SERVER['HTTP_IF_NONE_MATCH'] == $buffer_hash) {
        header('HTTP/1.1 304 Not Modified');
        header("ETag: $buffer_hash");
        return '';
    }
    header('Cache-Control: private, no-cache');
    header("ETag: $buffer_hash");
    return $content;
}

ob_start('hash_buffer');
?>

尝试更快地获取内容到缓冲区

为了更快地缓冲生成内容,您可以使用文件缓存。例如,将生成的导航/blogroll/newslist 写入文件并从那里读取,如果 filemtime 在缓存生命周期内(10 分钟 - 1 小时等),否则将其写入文件并照常处理。

您需要写锁以防止冲突等。请参阅该https://github.com/zendframework/zf2/blob/master/library/Zend/Cache/Storage/Adapter/Filesystem.php#L1489上的 ZendFramework 实现

记住

用户权限可能会在文件缓存中发挥作用,就像您不希望其他人的购物车出现在结帐页面上的任何缓存一样。通常,将经过身份验证的用户排除在文件缓存之外是安全的。

在文件上缓存时,必须保护缓存文件免受通过 Web 和其他方式的公共读写访问。

于 2013-08-07T10:39:47.743 回答