PHP Conference Japan 2024

session_cache_limiter

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

session_cache_limiter获取和/或设置当前缓存限制器

说明

session_cache_limiter(?string $value = null): string|false

session_cache_limiter() 返回当前缓存限制器的名称。

缓存限制器定义了哪些缓存控制 HTTP 头发送给客户端。这些头决定了页面内容可以被客户端和中间代理缓存的规则。将缓存限制器设置为 nocache 禁止任何客户端/代理缓存。值为 public 允许代理和客户端缓存,而 private 禁止代理缓存,但允许客户端缓存内容。

private 模式下,发送给客户端的 Expire 头可能会导致某些浏览器(包括 Mozilla)的混淆。您可以使用 private_no_expire 模式来避免此问题。在这种模式下,Expire 头永远不会发送给客户端。

将缓存限制器设置为 '' 将完全关闭自动发送缓存头。

缓存限制器在请求启动时重置为存储在 session.cache_limiter 中的默认值。因此,您需要在每个请求中调用 session_cache_limiter()(并在调用 session_start() 之前)。

参数

value

如果指定了 value 且不为 null,当前缓存限制器的名称将更改为新值。

可能的值
发送的头
public
Expires: (sometime in the future, according session.cache_expire)
Cache-Control: public, max-age=(sometime in the future, according to session.cache_expire)
Last-Modified: (the timestamp of when the session was last saved)
private_no_expire
Cache-Control: private, max-age=(session.cache_expire in the future)
Last-Modified: (the timestamp of when the session was last saved)
private
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private, max-age=(session.cache_expire in the future)
Last-Modified: (the timestamp of when the session was last saved)
nocache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache

返回值

返回当前缓存限制器的名称。如果更改值失败,则返回 false

更新日志

版本 说明
8.0.0 value 现在可以为 null。

示例

示例 #1 session_cache_limiter() 示例

<?php

/* 将缓存限制器设置为 'private' */

session_cache_limiter('private');
$cache_limiter = session_cache_limiter();

echo
"缓存限制器现在设置为 $cache_limiter<br />";
?>

添加一个注释

用户贡献的注释 24 个注释

up
11
clay at killersoft dot com
16 年前
使用上述值设置的实际头是

public
Expires: pageload + 3 hours
Cache-Control: public, max-age=10800

private
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private, max-age=10800, pre-check=10800

nocache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

private_no_expire
Cache-Control: private, max-age=10800, pre-check=10800


关于其他人提到的一些其他设置,那些根本不起作用。查看 PHP 的源代码,在 ext/session/session.c 中 -- 上述值是唯一真正起作用的。其他值或空字符串将导致根本不设置缓存限制头。
up
6
Jeremiah at jkjonesco dot com
18 年前
如果您尝试使用动态二进制文件(如视频或图像),新的 IE 7 似乎需要 ETag 头。您需要确保遵循 ETag 的工作方式规范,以便您的缓存控制正常工作。Mozilla 也支持 ETag 头,但不需要它来进行缓存。如果您需要缓存动态图像、视频或其他二进制文件,那么请确保设置您的 ETag,然后在后续请求中检查 If-Not-Modified 头,以便您可以正确返回 304 Not Modified 页面。
up
6
ire dot ogunsina at gmail dot com
16 年前
我遇到了一些阻止 IE(特别是 IE 7)停止缓存页面的问题。我阅读了相当多关于人们的经历以及他们如何解决它的文章,但很难找到一个对我有用的。最终我不得不使用以下修复方法
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">

基于以下 URL 上可用的信息:http://support.microsoft.com/kb/234067

但愿我们都永远放弃 IE。希望这可以为某人节省一些 IE 的痛苦。
up
2
john
18 年前
除上述内容外,不要忘记检查 php.ini 文件中的设置:session.cache_limiter = nocache

由于我使用 xoops 并且没有启动会话,所以在注意到这一点之前,我遇到了 SSL/下载问题。
up
2
snakes at ntica dot com
19 年前
避免缓存 PHP 页面
经过大量的尝试和研究,这是我发现的最佳头组合,即使对于使用卫星连接的访问者的代理也能很好地工作。

<?
header("ETag: PUB" . time());
header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()-10) . " GMT");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 5) . " GMT");
header("Pragma: no-cache");
header("Cache-Control: max-age=1, s-maxage=1, no-cache, must-revalidate");
session_cache_limiter("nocache");
?>
up
2
pulstar at ig dot com dot br
20 年前
您可以在 https://php.net/manual/en/function.header.php 找到有关在 PHP 中控制缓存的更多信息

如果您有一个动态网站,并希望允许您的访问者在使用 post 方法提交表单后使用后退按钮,我发现的最佳组合是

<?php

header
("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: post-check=0, pre-check=0",false);
session_cache_limiter("must-revalidate");

// 然后在您启动会话之后
session_start();

?>

我尝试了一些使用 header("Cache-Control: no-cache, must-revalidate") 的组合,但是当点击后退按钮时,表单中的最后更改会恢复到它们以前的状态。上面的组合在 IE 6.x 中运行良好。我没有在其它浏览器中测试过。

当我尝试类似 session_cache_limiter("nocache, must-revalidate") 的东西时,它不起作用。页面仅在我使用浏览器的刷新按钮时更新。在动态网站中,这不好。内容必须在每次点击后都是新鲜的。

我没有在手册中找到像“private, must-revalidate”这样的组合,我猜想不同于“none, nocache, private, public 和 private_no_expire”的组合会被解析为“none”或类似的东西。我注意到的一件事是在 session_cache_limiter() 中是“nocache”,但在 header() 中是“no-cache”。这可能为我们提供了一些关于 session_cache_limiter() 函数如何工作的线索。

关于缓存,我认为完美的解决方案是在网站元素真正更新时,为每个元素提供正确的过期日期和时间以及正确的 last-modified 标头。当然,这意味着大量的额外控制,但在高负载的网站中可能值得。

“public”选项意味着将使用代理和客户端中的所有可用缓存,因此这提高了网站的速度,也减少了使用的带宽。但是如果没有正确的过期时间和 last-modified 标头,您只能在静态网站中使用它。

“private”选项意味着仅使用客户端中的缓存。这对于可以存储在浏览器缓存中的更敏感的数据是有好处的。它具有 public 选项的一些好处,但也具有相同的限制。

“nocache”(或 no-cache?)选项意味着 HTML 部分将不会被缓存,但图像、CSS 和 JS 文件将被缓存。这对于动态网站很有用,因为您仍然可以使用缓存的功能,而不会在每次点击后失去新鲜度。当您打开网站或使用浏览器的刷新按钮时,这些文件可以更新。
我不知道为什么,但是当您单击刷新按钮时,Flash 文件永远不会更新。对此的常见解决方案是在更新 Flash 文件时更改文件名。

“no-store”选项意味着所有内容都不会被缓存,包括图像、CSS 或 JS 文件。我不知道这是否也适用于 Flash 文件,但这是可能的。此选项必须与非常敏感的数据一起使用。我认为 SSL 默认使用此选项。
up
1
yves 在 kochira 点 com
16 年前
为了避免在 Firefox 3.0.1 (+Firebug) 中尝试各种参数时头疼,只需在更改后重新启动浏览器即可...否则它们不会被考虑在内(从“no-cache”到“public”/“private”)。
up
1
richard 在 izyn 点 co 点 nz
20 年前
我发现在即时创建 PDF 时,session_cache_limiter("none") 对我有效,因为 session_cache_limiter("private") 会导致浏览器 (IE6) 无限期地缓存 PDF。
up
1
jthome 在 fcgov 点 com
21 年前
除了上面关于 SSL/IE 错误/会话的说明外,如果您要发送内联文档(例如 PDF 文档),还要确保不要设置标头“Pragma: no-cache”。

例如

<?php

header
("Content-Type: application/pdf");
header("Content-Disposition: inline; filename=foo.pdf");
header("Accept-Ranges: bytes");
header("Content-Length: $len");
header("Expires: 0");
header("Cache-Control: private");
// header("Pragma: no-cache");//不要发送此标头!!

?>

此致,

--
Jim
up
0
glenk7901
8 年前
我尝试修复由 session.cache_limiter 引起的问题时遇到了麻烦。不知何故,我在 .ini 文件中将此设置为 nocache(很久以前),此设置导致后退按钮不起作用。当 session.cache_limiter 设置为 private 或 public 时,后退按钮可以工作,但随后退出站点不起作用。我曾认为 session.cache_limiter 是应该启用的东西,但今天终于发现将其关闭(通过将其设置为 '')解决了这两个问题。所以现在我的问题是,什么时候有人会想使用 session.cache_limiter?我因为这个问题而讨厌 Php。
up
0
scott 在 realorganized 点 com
16 年前
http://us.php.net/session_cache_limiter

发送

Pragma: no-cache

在某些情况下从服务器发送到客户端。

Internet Explorer 对以下内容有奇怪的解释:Pragma: No-cache
从服务器发送到客户端。

这是链接

http://support.microsoft.com/kb/234067

如果客户端通过安全连接 (https://) 与服务器通信,并且服务器返回带有响应的 Pragma: no-cache 标头,则 Internet Explorer 不会缓存该响应。

但是请注意,Pragma: no-cache 标头并非用于此目的。根据 HTTP 1.0 和 1.1 规范,此标头仅在请求的上下文中定义,而不是响应,并且实际上是为可能阻止某些重要请求到达目标 Web 服务器的代理服务器定义的。对于未来的应用程序,Cache-Control 标头是控制缓存的正确方法。

出于这个原因,在将 Pragma: no-cache 与 https 和 IE 一起使用时要小心
up
0
匿名
19 年前
Andrei Chirila,andrei_chirila 在 yahoo 点 com
2005 年 1 月 12 日 09:30
我使用下载和会话玩了大约一个小时。是的,要使其工作,您需要 session_cache_limiter("must-revalidate"); 但这要在 session_start() 之前,如果您希望您的下载开始 [IE 问题]。希望有一天有人会需要这个

====

是的,今天有人需要这个 :)

情况:尝试创建一个基于会话的下载管理系统,该系统具有用户登录系统,该系统要求授权用户下载某些文件,并对非授权用户隐藏所有此类文件。网站的用户登录、下载中心和内容管理系统都绑定在一起,使得对这些标头内容进行故障排除成为一件令人头疼的事情。

问题:提供的文件无法通过常规站点访问,因为它们位于 apache 的 htdocs 文件夹上方,因此需要对文件进行标头处理,并且会话不能很好地处理标头处理到浏览器的文件。

解决方案:下载中心使用 ob_start("");,然后在 session_start(); 之前使用 session_cache_limiter("must-revalidate");,然后一切正常。

非常感谢!之前我不得不使用 cookie 来控制这个,因为我无法弄清楚如何将 会话 与系统联系起来!
up
0
donovan 在 go4 点 com 点 au
19 年前
IE6“无法将文件写入缓存”

我尝试了这里提到的所有其他建议,但没有一个有效。

我朋友建议 header("Pragma: ");

这马上奏效了!
up
0
justin 在 justintubbs 点 com
19 年前
我在运行 IIS 6.0 的 Windows 2003 服务器上运行 PHP 4.3,并且还对我的页面使用 SSL 加密。我无法(为了我的生命)弄清楚如何让 IE 6.0/WinXPPro 将一组 HTML 表格识别为 Excel 电子表格导出,这是由于我使用的 header() 变量造成的。希望这些对尝试在 PHP 中进行相同类型导出的其他人有所帮助。

*此示例基于先前提交的示例,添加了一些必要的标头。

<?php
header
("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");

session_cache_limiter("must-revalidate");
header("Content-Type: application/vnd.ms-excel");
header('Content-Disposition: attachment; filename="fileToExport.xls"');

// 在您启动会话之后
session_start();
?>
up
0
misterp3d 在 hotmail 点 com
20 年前
当我的网站用户使用后退按钮时,我遇到了使用带有 POST 方法的 FORM 的问题。该页面要求刷新才能再次看到 FORM。

为了解决这个问题,我使用了
<?php
session_cache_limiter
('private, must-revalidate');
?>

*您需要在任何输出之前编写此行

希望这对你们中的一些人有所帮助 ;)

[P]
up
0
MerlinsInvite
21 年前
我通过使用以下方法解决了将下载推送到浏览器的问题,而无需使用服务器/会话参数
header("Content-Disposition: inline; filename=\"$filename\"");
对于 IE 浏览器和
header("Content-Disposition: attachment; filename=\"$filename\"");
对于所有其他浏览器。
up
-1
匿名
19 年前
在使用 SSL 的 IE6 中,Actionscript 的 loadVars 类的 onLoad 方法返回 false,直到我在接收 PHP 脚本上设置了 --> session_cache_limiter("must-revalidate"); <--。
up
-1
Andrei Chirila, andrei_chirila 在 yahoo 点 com
19 年前
我花了一个小时左右的时间研究下载和会话。是的,为了正常工作,你需要使用 session_cache_limiter("must-revalidate"); 但这必须在 session_start() 之前调用,如果你想让你的下载能够开始的话 [IE 浏览器的问题]。希望将来有人会需要这个...
up
-1
Mikko H?m?l?inen
20 年前
我遇到了一个类似的问题(浏览器无法保存来自我的下载脚本的文件)。只是在我的情况下,这个问题出现在 IE 6.0 和 Netscape 7.1 上。在 "session_start();" 之前添加 "session_cache_limiter('public');" 解决了问题。
up
-1
plyrvt at mail dot ru (Yura Pylypenko)
21 年前
将 session_cache_limiter() 与 ob_start('ob_gzhandler') 一起使用时要小心
如果在 session_cache_limiter() 之后调用 ob_start('ob_gzhandler'),它似乎会用 'nocache' 等效值覆盖缓存控制标头。
所以总是先放置 ob_start。
up
-3
Fernando Gabrieli fgabrieli at gmail
17 年前
<?
session_cache_limiter ('private, must-revalidate');

$cache_limiter = session_cache_limiter();

//

session_cache_expire(60); // 以分钟为单位

session_start() ;
?>

如果我不设置 must-revalidate,IE 似乎会缓存会话变量而不刷新它们

如果我提交表单,它会刷新变量

Firefox 没有这个问题

所以,一定要使用 must-revalidate
up
-3
usenet at phord splat com
20 年前
嘿!NickyBoy 是对的!

我在谷歌上到处搜索,他的笔记是唯一正确的地方。但是,有一个警告。

我在这里写下了我的结果
http://www.phord.com/experiment/cache/
up
-3
radu dot rendec at ines dot ro
19 年前
我阅读了其他评论并自己做了一些“研究”。不应该混用 php 的会话机制和显式设置“cache-control”标头。

当调用 session_start() 时,php 会自动设置“cache-control”和“pragma”标头(设置为使用 session_cache_limiter() 指定的任何值)。

在 session_start() 之前显式设置这些标头将不起作用,而在 session_start() 之后显式设置它们将覆盖 session_cache_limiter() 的设置。

如果我必须处理 php 会话,我会选择使用 session_cache_limiter() 并保持标头不变。
up
-3
nickyboy at 4ce.co.uk
21 年前
人们提到的关于 IE 的问题实际上是一个特性!
微软知识库文章 316431 说

为了让 Internet Explorer 打开 Office 中的文档(或任何进程外的 ActiveX 文档服务器),Internet Explorer 必须将文件保存到本地缓存目录,并要求关联的应用程序使用 IPersistFile::Load 加载文件。如果文件未存储到磁盘,则此操作将失败。

当 Internet Explorer 通过 SSL 与安全网站通信时,Internet Explorer 会强制执行任何无缓存请求。如果存在一个或多个标头,Internet Explorer 将不会缓存该文件。因此,Office 无法打开该文件。

他们说这适用于
适用于 Windows 2000 的 Microsoft Internet Explorer 5.5
适用于 Windows 2000 的 Microsoft Internet Explorer 5.01
适用于 Windows 2000 的 Microsoft Internet Explorer 版本 6
不确定其他版本!

希望有帮助
尼基男孩
To Top