2011-02-26 22 views
1

在我的框架中,我對session_write_close()進行了一些調用。PHP session_write_close()一直髮送一個set-cookie標頭

我們假設一個會話已經由用戶代理啓動。下面的代碼...

foreach($i = 0; $i < 3; $i++) { 
    session_start(); 
    session_write_close(); 
} 

...將下面的請求頭髮送到瀏覽器:

Set-Cookie PHPSESSID=bv4d0n31vj2otb8mjtr59ln322; path=/ 
       PHPSESSID=bv4d0n31vj2otb8mjtr59ln322; path=/ 

不應該有任何的Set-Cookie頭,因爲我規定,會話cookie已經在用戶端創建。但是,在上述腳本中的第一個腳本之後,每次調用session_write_close()都會導致PHP指示瀏覽器再次設置當前會話。

這不是打破我的應用程序或任何東西,但它很煩人。有沒有人有任何洞察力,防止PHP重新設置cookie與隨後每次調用session_write_close?

編輯

這個問題似乎是與每一個後續調用在session_start(),PHP重新設置會話cookie自身的SID併發送一個Set-Cookie響應頭。但爲什麼??

+0

我回答了這個在這裏的解決方案:http://stackoverflow.com/questions/10046570/php-save-session-when-using-session-write-close/16576572#16576572 – CMCDragonkai 2013-05-31 02:55:44

回答

1

PHP不建議這樣做,並有bunch of bugs submitted for this。因爲他們認爲這不是一個好的做法 - 這是不會修復的錯誤。

+0

謝謝鏈接。我同意最後一位評論者的意見,他聲稱在整個代碼中使用多個session_start/session_write_close塊是完全有效的。如果會議沒有被明確地關閉,我的網站將被完全鎖定。 – 2011-02-26 23:23:00

+0

那麼解決這個問題的唯一方法就是實現自定義會話cookie? – 2011-02-26 23:27:05

+0

看起來像這樣...雖然如果一切工作都沒有它,我會離開默認執行... – Sergey 2011-02-27 16:07:14

0

session_write_close剛剛結束會話和寫入數據
而在session_start發送cookie
如果我想知道我發送會話cookie你一定不能調用session_start

0

幾乎我在SO上找到的每一個答案都表示,一次又一次地做一個session_write_close()session_start() ......有些甚至暫時禁用了ini_set的cookie ...這似乎是一個非常糟糕的方法。 PHP作者提供了一個非常明確,最佳實踐的途徑,通過使用session_set_save_handler來注入自己的處理會話的方式。

我已經創建了一個展示如何在你的session_start()Session::start()代替,並用Session::save()取代session_write_close()在另一篇文章中的例子。該類是爲PHP 5.4+實現的非阻塞(用戶可以有併發請求)類。實際上,它只是PHP示例類的一個調整版本。

雖然我的示例是PHP 5.4+,但同樣的方法在舊版本的PHP中使用回調方法代替接口實現。

https://stackoverflow.com/a/27993746/482256