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_start() 之前)调用 session_cache_limiter()

参数

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 现在可以为空。

示例

示例 #1 session_cache_limiter() 示例

<?php

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

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

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

添加注释

用户贡献注释 25 个注释

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

public
Expires: 页面加载 + 3 小时
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 中 -- 上面的值是唯一真正起作用的值。其他值或空字符串会导致根本不设置任何缓存限制标头。
6
Jeremiah at jkjonesco dot com
17 年前
如果您尝试使用视频或图像等动态二进制文件,新的 IE 7 似乎需要 ETag 标头。您需要确保遵循 ETag 的工作规范,以便您的缓存控制正常工作。Mozilla 也支持 ETag 标头,但不强制要求它进行缓存。如果您需要缓存动态图像、视频或其他二进制文件,那么请确保设置您的 ETag,然后在后续请求中检查 If-Not-Modified 标头,以便您可以正确返回 304 Not Modified 页面。
6
ire dot ogunsina at gmail dot com
15 年前
我在阻止 IE,特别是 IE 7 停止缓存页面方面遇到了一些麻烦。我阅读了许多关于人们的经验及其解决方法的文章,但很难找到对我有用的方法。最终,我不得不使用以下修复方法
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">

基于以下网址上的信息:http://support.microsoft.com/kb/234067

愿上帝保佑我们所有人都能永远放弃 IE。希望这能帮助某人免受 IE 的痛苦。
1
glenk7901
8 年前
我一直在努力解决由 session.cache_limiter 引起的问题。不知何故,我在 .ini 文件中将它设置为 nocache(很久以前),这个设置导致后退按钮无法工作。当 session.cache_limiter 设置为 private 或 public 时,后退按钮可以工作,但随后注销网站却无法工作。我以为 session.cache_limiter 是应该启用的东西,但今天终于发现关闭它(通过将其设置为 '')解决了这两个问题。所以现在我的问题是,什么时候有人会想要使用 session.cache_limiter?我因为这个问题而讨厌 Php。
2
john
18 年前
此外,不要忘记检查 php.ini 文件中的设置:session.cache_limiter = nocache

由于我使用 xoops 并且没有启动会话,因此我在注意到这一点之前一直存在 SSL/下载问题。
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");
?>
2
pulstar at ig dot com dot br
19 年前
您可以在 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 and 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 默认使用此选项。
1
donovan at go4 dot com dot au
19 年前
IE6“文件无法写入缓存”。

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

一位朋友建议使用 header("Pragma: ");

这立即生效了!
1
yves at kochira point com
15 年前
为了避免在 Firefox 3.0.1(+Firebug)中尝试各种参数时出现头痛,只需在更改后重新启动浏览器...否则它们不会被考虑(从“no-cache”到“public”/“private”)。
1
richard at izyn dot co dot nz
20 年前
我发现,当我动态创建 PDF 时,session_cache_limiter("none") 对我有效,因为 session_cache_limiter("private") 会导致浏览器(IE6)无限期地缓存 PDF。
1
jthome at fcgov dot com
20 年前
除了上面关于 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
1
justin at justintubbs dot com
19 年前
我在运行 IIS 6.0 的 Windows 2003 Server 上运行着 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();
?>
0
scott at realorganized dot 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 规范,此头部仅在请求的上下文中定义,而不是在响应中定义,实际上它 предназначено для прокси-серверов, которые могут предотвращать достижение некоторых важных запросов целевого веб-сервера. 对于未来的应用程序,Cache-Control 头部是控制缓存的正确方法。

因此,在使用 Pragma: no-cache 与 https 和 IE 时要小心。
0
Anonymous
18 年前
Andrei Chirila,andrei_chirila at yahoo dot com
2005-01-12 09:30
我玩了大约一个小时的下载和会话。是的,要使其正常工作,你需要使用 session_cache_limiter("must-revalidate");,但要在 session_start() 之前使用它,如果你想让你的下载开始 [IE 问题]。希望有人有一天会需要这个。

====

是的,今天有人需要它 :)

情况:试图创建一个基于会话的下载管理系统,该系统具有用户登录系统,要求授权用户下载一些文件,并向未授权用户隐藏所有此类文件。网站的用户登录、下载中心和内容管理系统都相互绑定,这使得对这些头部的调试成为一个难题。

问题:被提供的文件无法通过常规网站访问,因为它们位于 Apache 的 htdocs 文件夹之上,因此需要对文件进行头部处理,而会话无法很好地与头部发送到浏览器的文件协同工作。

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

非常感谢您!我之前一直在使用 cookie 来控制这个问题,因为我之前无法弄清楚如何在系统中绑定会话!
0
misterp3d at hotmail dot com
20 年前
我在使用 POST 方法的表单时遇到问题,当我的网站用户使用后退按钮时。请求的页面需要刷新才能再次看到表单。

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

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

希望这能帮到你们中的一些人;)

[P]
0
MerlinsInvite
21 年前
我通过使用
header("Content-Disposition: inline; filename=\"$filename\"");
来解决了将下载推送到浏览器的問題,而无需玩弄服务器/会话参数,适用于 IE 浏览器,以及
header("Content-Disposition: attachment; filename=\"$filename\"");
适用于所有其他浏览器。
-1
Anonymous
18 年前
直到我在接收 PHP 脚本上设置 --> session_cache_limiter("must-revalidate"); <--,Actionscript 的 loadVars 类的 onLoad 方法在 IE6 中使用 SSL 时才返回 false。
-1
Andrei Chirila, andrei_chirila at yahoo dot com
19 年前
我玩了大约一个小时的下载和会话。是的,要使其正常工作,你需要使用 session_cache_limiter("must-revalidate");,但要在 session_start() 之前使用它,如果你想让你的下载开始 [IE 问题]。希望有人有一天会需要这个...
-1
Mikko H?m?l?inen
20 年前
我遇到了类似的问题(浏览器无法保存来自我的下载脚本的文件)。只是在我的情况下,问题出现在 IE 6.0 和 Netscape 7.1 上。在 "session_start();" 之前添加 "session_cache_limiter('public');" 有所帮助。
-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 放在前面。
-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
-3
usenet at phord splat com
20 年前
嘿!NickyBoy 是对的!

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

我在這裡寫下了我的結果
http://www.phord.com/experiment/cache/
-3
radu dot rendec at ines dot ro
18 年前
我閱讀了其他評論,並自己做了一些「研究」。使用 php 的會話機制和顯式設定「cache-control」標頭不應混合使用。

當呼叫 session_start() 時,php 會自動設定「cache-control」和「pragma」標頭(設定為使用 session_cache_limiter() 指定的任何值)。

在 session_start() 之前顯式設定這些標頭將不起作用,而在 session_start() 之後顯式設定這些標頭將覆蓋來自 session_cache_limiter() 的設定。

如果我必須處理 php 會話,我會使用 session_cache_limiter() 並保持標頭不變。
-3
nickyboy at 4ce.co.uk
21 年前
人們提到的有關 IE 的問題實際上是一項功能!
Microsoft 知識庫文章 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
不確定其他版本!

希望對您有所幫助
nickyboy
-7
kubavathimanshu76 at gmail dot com
9 年前
但我遇到的問題是,在同一瀏覽器中,我使用不同的使用者登入同一專案,但最後一個登入的使用者會覆蓋所有其他使用者的登入資訊,如何防止這種情況發生?
To Top