2011-09-30 93 views
0

由於服務器設置,我不得不使用$ _COOKIE而不是$ _SESSION來管理項目的會話變量。

在我的搜索表單上,我設置了一個初始cookie,但尚不清楚這是有用還是需要?

setcookie('NOSG', 'oHai', time()+7200, '/', 'some.org'); 

每次搜索結果頁面加載我遍歷餅乾和回覆日期的那些我需要清除,然後設置新值,就像這樣:

if ($board) { 
    foreach ($_COOKIE as $k => $v) { 
    if (preg_match('/boa_/', $k)) { 
     setcookie($k, '', time()-3600, '/', 'some.org'); 
    } 
    } 
    foreach ($people as $p) { 
    setcookie('boa_'.$p->ID, $p->whatever, time()+7200, '/', 'some.org'); 
    } 
} 

晴,這是用於製造在多行<SELECT>輸入的粘性選擇。

這種方法聽起來嗎?我很少使用$ _COOKIE來做任何事情。

//編輯1:12 PM GMT-06:00 所有的評論和答案都集中在修復會話。我認爲這是因爲該方法建議的原因有些不正確?問的問題是使用$ _COOKIE來記住表單設置。有人會關心爲什麼我使用的方法是或不適合這個問題嗎?

+1

什麼樣的服務器設置? –

+2

你真的應該改變你的服務器設置以允許會話。我從來沒有見過一個沒有會話的網站...... $ _COOKIE數據是用戶自由閱讀和編輯的。 – ceejayoz

+0

權限被拒絕。 session.save_path設置爲/ var/lib/php/session PHP警告:未知:無法寫入會話數據(文件)。請確認第0行 – jerrygarciuh

回答

0

沒有受訪者解決我的問題:是否使用$ _COOKIE存儲會話數據的一種合理方法?

經驗告訴我他們不會。並非所有瀏覽器都以相同的方式處理Cookie。例如,Internet Explorer對每個域的cookies數量都有限制:http://support.microsoft.com/kb/941495

所以答案是:$ _SESSION優於cookie,因爲它由PHP以相同的方式處理所有瀏覽器。

2

從技術上講,所有會話都是一個包含變量的文本文件(您也可以將數據保存在數據庫中),這些變量由cookie(或地址欄)中保存的值來標識。

使用諸如setcookie(),serialize()和file_put_contents()寫入web樹之外的文件夾之類的東西,在PHP中重新創建功能是不可能的......儘管您可能還需要Cron作業計劃垃圾收集(公平地說,PHP本地會話GC似乎並不太好)。

你只需要創建一個自定義的會話處理對象,並在Cookie中爲它設置「會話」標識,就像使用普通的會話處理一樣 - 除了使用$ _SESSION你Session :: get()和Session :: set()方法。

如果您保持API清潔,那麼在未來的日期,如果您設法在服務器上啓用會話處理,則只需調整會話處理對象,而不會影響程序的其餘部分代碼 - 無論如何,抽象掉會話處理可能是一個好主意。

4

錯誤

Permission denied. session.save_path is set to /var/lib/php/session PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0 

是由於您的主機/系統管理員的部分錯誤。他們應該將/ var/lib/php/session的權限設置爲777,以便所有用戶都可以寫入。如果他們正在使用執行PHP腳本的東西作爲用戶,則數據仍然安全,因爲您的用戶將擁有會話數據文件,以便其他人無法查看或修改它。

或者,您可以將會話保存路徑動態更改爲您所控制的目錄。

如果你有發起的會議上達成共同文件,在session_start()之前補充一點:

session_save_path('/home/yoursite/sessions'); 
// or 
session_save_path($_SERVER['DOCUMENT_ROOT'] . '../sessions'); 
// or, an alternate method 
ini_set('session.save_path', '/home/yoursite/sessions'); 
session_start(); 

然後就創建了一個文件夾,並設置適當的權限,以便它讀取你的用戶/寫只要。

+0

雖然我的答案是可行的......這是一個更明智的解決方案,所以我已經投了票。儘管如此,我仍然會將會話管理抽象爲一個對象;) – CD001