2011-09-09 58 views
-1

我有一些調查問卷,其中有一些字段檢查(用PHP + HTML編寫)。所以我通過https發送數據。PHP會話行爲

它的工作原理是這樣

<form id="frm_order" method="post" action="https://site/service_for_businesses" autocomplete="off"> 
<input name="username" id="username" size="40" maxlength="500" type="text" value=""> 
<button name="Submit" id="Submit" value="Отправить" type="submit" onclick="return final_check();"></button> 
</form> 

後用戶點擊提交按鈕所有的數據移動到$ _SESSION [「PARAMS」],然後傳遞到這個數據正在檢查輔助類。如果一切正常,那麼用戶被重定向到「成功頁面」(這部分工作正常),但是如果在表單字段中USER數據中有任何錯誤,則$ _SESSION [..]被傳遞給VIEW控制器,頁面被刷新並且在出現錯誤的表單字段附近出現警告。 的問題是,有一個奇怪的行爲是這樣的:

1)我寫了一些數據,例如我寫下一個用戶名「彌%^ XS」
2)按下提交
3)有一個錯誤檢查數據,導致用戶不允許使用特殊符號,所以有重定向
4)我看到一個頁面,用我的用戶名和警告低於
5)我什麼也沒做,只是按下提交 - >重定向
6)我得到空的領域沒有任何警告
7)我按SUBMIT - >重定向
8)我得到了與步驟4相同的東西 - 我的用戶名有警告
etc

我不明白爲什麼。

我的網站被部署到2臺Web服務器(避免DdoS)與平衡器。 這就像在兩臺服務器上有兩個具有相同ID的會話

+0

我終於解決了這個問題。看來,有2個額外的服務器與nginx作爲代理。所以我編輯了它的配置文件並解決了問題。 –

回答

1

默認情況下,PHP生成會話ID並將其存儲在由session.save_path的php.ini中定義

同樣的目錄,如果您發送到PHP不存在會話cookie,PHP將創建相應的會話。

因此,如果您在創建會話的服務器1上發出請求,它將爲該會話創建一個cookie。如果你然後切換到服務器2,它會識別會話cookie,如果會話已經存在,它將使用它(你的情況很明顯)。在這種情況下,您擁有兩臺服務器的會話ID相同,每臺服務器上都有不同的數據。

該問題的解決方案是將會話存儲在2臺服務器(例如數據庫)通用的地方。請參閱:http://fr.php.net/manual/en/function.session-set-save-handler.php

1

apache中的會話通常存儲在本地磁盤上。 (請參閱位置的php配置。)

如果您將PHP會話保存路徑設置爲某些共享資源(例如通過NFS的網絡磁盤);它可能實際上共享會話信息,從而允許您在兩臺服務器上擁有相同的會話。

至少,除非PHP + Apache實例實際上具有相同的會話存儲;他們將針對相同(或甚至其他)SID進行不同的會話。

1

默認情況下,PHP會將會話文件保存到/ tmp目錄中。如果您在2個webservers目錄中運行您的網站,必須可以從兩個webservers目錄中訪問它們,否則每個網絡服務器都將存儲他自己的會話文件。

您可以通過在你的php.ini設置session.save_path的改變目錄。查看詳情這裏:http://www.php.net/manual/en/session.configuration.php

您還可以存儲會話數據庫。