[英]Prevent php session_start() to send a cookie
我想知道是否有辦法阻止PHP在調用session_start()
時發送cookie。
我的用例是網站優化:
客戶端已收到會話cookie。 所以我不需要session_start()
來發送新的(和冗余的)。
有人知道攔截cookie或類似的方法嗎? 當然我想避免“無法發送會話cookie - 已經發送的標題”。 此錯誤對用戶不可見,因為該頁面已經渲染,但在日志中看起來很難看。
我的問題似乎是多余的,但事實並非如此。 我知道標題和內容是如何工作的(首先發送標題,然后發送內容)。 只是PHP不讓我做我想做的事。
我想知道是否有辦法阻止PHP在調用session_start()時發送cookie。
是的,通過告訴PHP不使用cookie進行會話。 PHP設置是session.use_cookies
:
ini_set('session.use_cookies', 0); # disable session cookies
session_start();
默認情況下,啟用cookie是因為它們被認為比使用URL參數更安全(請參閱會話和安全文檔 )。
(2)最后,我有一個頁面后渲染過程(對於統計數據),需要對會話進行寫訪問。 會話已關閉,我無法再次調用session_start(),因為它發送了一個cookie,而且為時已晚。 這是一個計算量很大的過程,因此我必須在將頁面發送到客戶端后執行此操作。
通過將cookie添加到$_COOKIE
超全局數組文檔中 ,可能會告訴PHP已經設置了cookie。 我從未嘗試過它,但是如果您使用session_start()
並且PHP看到會話cookie已經設置(由瀏覽器而不是PHP, $_COOKIE
代表瀏覽器cookie),它將不會發送標題(再次)設置cookie(據我所知你是你想要的)。
編輯:一些測試腳本:
<?php
header('Content-Type: text/plain;');
echo "Incomming Cookies:\n";
print_r($_COOKIE);
// to simulate that this is a new session, the session cookie is removed
// which makes PHP think it is a new session when invoking session_start()
// unset($_COOKIE['PHPSESSID']);
// run the first session
session_start(); // creates the session cookie (as we don't have one yet)
printf("Session %s has been started: %s\n", session_name(), session_id());
var_dump($_SESSION);
$_SESSION['variable'] = isset($_SESSION['variable']) ? $_SESSION['variable']++ : 0;
session_commit();
printf("Session has been closed, remaining id is: %s\n", session_id());
// visual confirmation that session cookie has been created
echo "Outgoing Cookies:\n";
print_r(headers_list());
// run the second session
ini_set('session.use_cookies', 0); # disable session cookies
session_start();
printf("Second session %s has been started: %s\n", session_name(), session_id());
var_dump($_SESSION);
$_SESSION['2nd-variable'] = isset($_SESSION['2nd-variable']) ? $_SESSION['2nd-variable']++ : 0;
session_commit();
您需要使用Web瀏覽器調用它(並且必須配置PHP會話才能工作)。
我想我應該提一下防止在調用session_start時發送cookie(和緩存限制器)標頭的另一種好方法。
session_start調用采用options數組,您可以在其中設置任何會話。 前綴變量,你可以為這個調用禁用這些東西。
session_start(array(
'use_cookies' => '0',
'cache_limiter' => ''
));
請注意,use_cookies會阻止cookie被發送,並且將緩存限制器設置為空字符串會使其無法更新緩存頭(而不是最佳記錄功能)。
以下是兩個注意事項(這將在您需要完成多個會話時很有用)。
Warning: session_start(): Cannot send session cookie - headers already sent
和
Warning: session_start(): Cannot send session cache limiter - headers already sent
您可以使用ob_start()函數緩沖標頭/內容,您可以使用ob_clean()清除緩沖區內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.