2008-10-04 74 views
7

我有一個API依賴於請求之間的某些狀態信息。作爲代碼的第一個簡單版本,我只是簡單地使用PHP會話來存儲狀態信息,而不是更先進的(APC,memcache,DB)。在我通過網絡瀏覽器進行的最初測試中,一切都很完美。但是,似乎當客戶端嘗試通過諸如Curl或wget之類的非瀏覽器方法進行連接時,狀態信息未被保留。在PHP中會創建一個會話,如果瀏覽器不使用

僅當瀏覽器正在請求頁面時纔會創建PHP會話嗎?我明確地使用session_start()開始會話,並使用session_name()事先命名它。

附加說明。我瞭解到,我遇到的一個主要問題是我正在命名會話,而不是通過session_id($ id)設置會話ID;我使用session_name()的意圖是檢索先前創建的同一會話,並且正確的方法是將session_id設置爲session_name。

看來,會話信息將保留在服務器上,如下所述(謝謝)。但爲了保持這一點,您必須通過會話ID,或者,在我的情況下,任何其他唯一標識用戶的ID。使用此id作爲session_id,您的會話將按預期運行。

回答

20

會話Cookie

請記住,HTTP是無狀態的,所以會話跟蹤您的服務器上,但客戶與每個請求對自身進行識別。當您聲明session_start(),時,您的瀏覽器通常會設置一個cookie(「PHP會話Id」),然後通過發送每個請求的cookie值來標識自己。當使用具有會話值的請求調用腳本時,session_start()函數將嘗試查找會話。爲了向你自己證明這一點,請注意,當你清除Cookies時,會話就會消失。如果cookie是「會話」cookie(臨時cookie),即使你退出瀏覽器,許多人也會死亡。您提到您正在命名會話。請查看您的瀏覽器Cookie並查看是否可以找到具有相同名稱的Cookie。

所有這一切是說,餅乾都打在你的會議中發揮積極作用,因此,如果客戶端不支持cookie,那麼你不能做一個會話你目前做的方式。至少不適合那些替代客戶。會話將在服務器上創建;問題是客戶是否參與。

如果Cookie不是您的客戶的選項,您將不得不尋找另一種方式將會話ID傳遞給服務器。例如,這可以在查詢字符串中完成,儘管以這種方式發送會話ID被認爲不那麼私密。

mysite.com?PHPSESSID=10alksdjfq9e 

如何做到這一點具體可能會與您的PHP版本有所不同,但它基本上只是一個配置。如果設置了正確的運行時選項,PHP會將會話標識作爲查詢參數透明地添加到頁面上的鏈接上(當然,只有同源代碼)。你可以在PHP website上找到詳細的設置。

旁註:幾年前,這是嘗試實施會話時常見的問題。由於聲稱的安全問題,Cookie更新,許多人都在瀏覽器中關閉cookie支持。

旁註:@Uberfuzzy牌子好點 - 使用會話,捲曲或wget的實際上是可能的。問題在於它不那麼自動。用戶可能會將標題值轉儲到文件中,並在將來的請求中使用這些值。 curl有一些「cookie意識」標誌,可以讓你更輕鬆地處理,但你仍然必須明確地做到這一點。然後再次,你可以使用這個你的優勢。如果您的替代客戶端有捲曲,則可以使用cookie識別標誌自己打電話。請參閱curl manual

+0

>但如果客戶端不支持cookie(如捲曲或wget) 實際上。同時支持一些存儲/加載cookie文件的方式 – Uberfuzzy 2008-10-04 09:29:16

2

如果您調用session_start(),那麼如果客戶端不在現有客戶端中,將創建一個會話。如果客戶端不支持(或被配置爲忽略)用於維護會話的cookie或查詢字符串機制,則將在每個請求上創建新的會話。

這可能會膨脹您的會話存儲機制與未使用的會話。

如果您在會話中存儲某些內容(例如,用戶登錄或其他機器人不太可能執行的操作)時只調用session_start()可能會更好一些,如果您覺得這可能會成爲一個問題。

2

僅當瀏覽器正在請求頁面時纔會創建PHP會話嗎?

簡答:是的。會話是專門爲利用瀏覽器功能解決HTTP無狀態問題而創建的。 APC,memcached,DB等無所謂。這些只是會話的存儲方法,並會遭受同樣的問題。

較長的答案:創建會話的概念是爲了說明HTTP是無狀態協議,事實證明,狀態對於各種軟件應用程序非常重要。

實現會話的最常見方式是使用cookie。 PHP使用cookie發送會話ID,瀏覽器發回帶有會話ID的cookie。此ID用於服務器上查找您存儲在會話中的任何信息。 PHP有能力在URL末尾包含和讀取會話ID,這假設用戶將通過單擊包含生成的會話ID的鏈接導航到您的站點/應用程序中的頁面。

在您的具體情況下,可以使用curl(也可能是wget)的cookie。捲曲一個Web瀏覽器,只有一個沒有GUI。如果是你使用的命令行卷曲程序(相對於C庫,PHP擴展等),請閱讀以下選項

-b/--cookie 
-c/--cookie-jar 
-j/--junk-session-cookies 
相關問題