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 標頭會傳送至用戶端。這些標頭會決定用戶端和中間 Proxy 快取頁面內容的規則。將快取限制器設定為 nocache 會禁止任何用戶端/Proxy 快取。public 值允許 Proxy 和用戶端快取,而 private 禁止 Proxy 快取,並允許用戶端快取內容。

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 則註解

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 中 -- 上述值是實際執行任何操作的所有值。其他值或空字串,會導致完全不設定快取限制標頭。
Jeremiah at jkjonesco dot com
18 年前
如果您嘗試使用動態二進制檔案(例如影片或影像),新的 IE 7 似乎需要 ETag 標頭。您需要確定您遵循 ETag 的運作方式規格,才能使您的快取控制正常運作。Mozilla 也支援 ETag 標頭,但快取不需要它。如果您需要快取動態影像、影片或其他二進制檔案,請務必設定您的 ETag,然後檢查後續請求的 If-Not-Modified 標頭,以便正確傳回 304 Not Modified 頁面。
ire dot ogunsina at gmail dot com
16 年前
我曾經遇到一些問題,無法阻止 IE(尤其是 IE 7)停止快取頁面。我閱讀了許多關於人們的經驗以及他們如何修復它的文章,但很難找到一個對我有用的。最後我不得不使用以下修復
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">

根據以下網址提供的資訊:http://support.microsoft.com/kb/234067

但願我們都永遠退出 IE。希望這能為某些人節省一些關於 IE 的痛苦。
john
18 年前
除了以上內容,別忘了檢查 php.ini 檔案中的設定:session.cache_limiter = nocache

由於我使用 xoops 且沒有啟動 session,直到我注意到這一點,我才遇到 SSL/下載問題。
snakes at ntica dot com
19 年前
避免快取 PHP 頁面
經過多次嘗試和研究,這是我發現的標頭最佳組合,即使使用衛星連線訪客的 Proxy,似乎也能運作良好。

<?
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");
?>
pulstar at ig dot com dot br
20 年前
您可以在 https://php.dev.org.tw/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 後
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 預設使用這個選項。
yves at kochira point com
16 年前
為了避免在 Firefox 3.0.1 (+Firebug) 中嘗試各種參數時感到頭痛,只需在變更後重新啟動瀏覽器...否則它們不會被納入考量 (從 'no-cache' 到 'public'/'private')。
richard at izyn dot co dot nz
20 年前
我發現當我動態建立 PDF 時,session_cache_limiter("none") 對我有效,因為 session_cache_limiter("private") 會導致瀏覽器 (IE6) 無限期地快取 PDF。
jthome at fcgov dot com
21 年前
除了上面關於 SSL/IE 錯誤/Session 的註解之外,如果你要傳送內嵌文件 (例如,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");//不要傳送這個標頭!!

?>

Best,

--
Jim
glenk7901
8 年前
我為了修復 session.cache_limiter 導致的問題而感到困擾。不知何故,我很久以前在 .ini 檔案中將它設定為 nocache,這個設定導致「上一頁」按鈕無法運作。當 session.cache_limiter 設定為 private 或 public 時,「上一頁」按鈕可以運作,但隨後登出網站就無法運作。我曾認為 session.cache_limiter 應該啟用,但今天終於發現將其關閉 (設定為 '') 可以修復這兩個問題。所以現在我心中的問題是,到底什麼時候會有人想要使用 session.cache_limiter?我因為這個問題而討厭 PHP。
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 規格,此標頭僅在請求的上下文中定義,而非回應,實際上是為了讓代理伺服器避免某些重要的請求無法送達目標 Web 伺服器。對於未來的應用程式,Cache-Control 標頭才是控制快取的正確方式。

因此,使用 Pragma: no-cache 與 https 和 IE 時要小心。
Anonymous
19 年前
Andrei Chirila, andrei_chirila at yahoo dot com
2005 年 1 月 12 日 09:30
我花了約一個小時研究下載和 sessions。是的,要使其運作,你需要 session_cache_limiter("must-revalidate"); 但如果希望你的下載開始 [IE 問題],則必須在 session_start() 之前執行此操作。希望有一天有人會需要這個。

====

是的,今天就有人需要這個 :)

情況:試圖製作一個基於 session 的下載管理系統,其中包含使用者登入系統,要求授權使用者才能下載某些檔案,並隱藏所有此類檔案,不讓未授權的使用者存取。網站的使用者登入、下載中心和內容管理系統都相互關聯,使得對此標頭問題進行故障排除非常頭痛。

問題:由於檔案位於 Apache 中 htdocs 資料夾之上,因此無法透過常規網站存取正在提供的檔案,因此需要標頭檔案,而 sessions 與標頭到瀏覽器的檔案運作不佳。

解決方案:下載中心使用 ob_start("");,然後是 session_cache_limiter("must-revalidate");,在 session_start(); 之前,然後一切運作良好。

非常感謝!我之前一直使用 cookie 來控制它,因為我無法弄清楚如何將 sessions 連接到系統!
donovan at go4 dot com dot au
19 年前
IE6「無法將檔案寫入快取」

我嘗試了這裡提到的所有其他建議,但沒有一個有效。

一位朋友建議 header("Pragma: ");

這立刻就奏效了!
justin at justintubbs dot com
19 年前
我的 PHP 4.3 在 Windows 2003 Server 上執行,使用 IIS 6.0,並且我的頁面也使用 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 後
session_start();
?>
misterp3d at hotmail dot com
20 年前
當我的網站使用者使用瀏覽器的返回按鈕時,我在使用 POST 方法的 FORM 表單時遇到問題。該頁面需要重新整理才能再次看到 FORM 表單。

為了解決這個問題,我使用了
<?php
session_cache_limiter
('private, must-revalidate');
?>

*你需要將這行程式碼寫在任何輸出之前

希望這能幫助到你們中的一些人 😉

[P]
MerlinsInvite
21 年前
我透過將下載內容推送到瀏覽器來解決了問題,而無需透過使用以下程式碼來操作伺服器/session 參數:
header("Content-Disposition: inline; filename=\"$filename\"");
給 IE 瀏覽器使用,以及
header("Content-Disposition: attachment; filename=\"$filename\"");
給所有其他瀏覽器使用。
Anonymous
19 年前
在接收 PHP 腳本上設定 --> session_cache_limiter("must-revalidate"); <-- 之前,Actionscript 的 loadVars 類別的 onLoad 方法在使用 SSL 時在 IE6 中返回 false。
Andrei Chirila, andrei_chirila at yahoo dot com
19 年前
我花了約一個小時處理下載和 session 的問題。沒錯,若要使其運作,你需要使用 session_cache_limiter("must-revalidate"); 但如果你希望你的下載開始 [IE 的問題],則必須在 session_start() 之前執行此操作。希望有一天有人會需要這個資訊...
Mikko H?m?l?inen
20 年前
我遇到了一個類似的問題(瀏覽器無法儲存來自我的下載腳本的檔案)。只有我的情況發生在 IE 6.0 和 Netscape 7.1 上。在 "session_start();" 之前加入 "session_cache_limiter('public');" 有所幫助。
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。
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 似乎會快取 session 變數而不重新整理它們

如果我發送表單,則會重新整理變數

Firefox 沒有這個問題

所以,請務必使用 must-revalidate
usenet at phord splat com
20 年前
嘿!NickyBoy 是對的!

我查遍了 Google,只有他的註解是正確的。但是,有一個警告。

我把我的結果寫在這裡
http://www.phord.com/experiment/cache/
radu dot rendec at ines dot ro
19 年前
我閱讀了其他評論,並自行做了一些「研究」。不應將使用 PHP 的 session 機制和明確設定「快取控制」標頭混用。

當呼叫 session_start() 時,PHP 會自動設定「快取控制」和「pragma」標頭(為使用 session_cache_limiter() 指定的任何值)。

在 session_start() _之前_ 明確設定這些標頭將沒有任何作用,而在 session_start() _之後_ 明確設定它們將會覆寫 session_cache_limiter() 的設定。

如果我必須處理 PHP session,我會選擇使用 session_cache_limiter() 並保持標頭不變。
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 無法開啟該檔案。

他們說這適用於
Microsoft Internet Explorer 5.5 for Windows 2000
Microsoft Internet Explorer 5.01 for Windows 2000
Microsoft Internet Explorer version 6 for Windows 2000
不確定其他版本!

希望這能幫助到您
nickyboy
To Top