簡體   English   中英

阻止php session_start()發送cookie

[英]Prevent php session_start() to send a cookie

我想知道是否有辦法阻止PHP在調用session_start()時發送cookie。

我的用例是網站優化:

  • (1a)我首先打開一個會話/發送標題。
  • (1b)然后生成並輸出一些文本內容。
  • (1c)為了增強會話讀/寫,我不再需要在會話中寫入時調用“session_write_close”。
  • (2)最后,我有一個頁面后渲染過程(對於統計數據),需要對會話進行寫訪問。 會話已關閉,我無法再次調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM