2014-02-25 38 views
1

我正在構建單一登錄系統,我正在使用cURL將請求發送到主站點上的文件並返回結果/它們的結果用戶數據;但是,如果用戶通過cookie登錄到輔助站點(即:他們當前未登錄到主站點),我需要確保他們同時登錄到主站點並設置一些會話變量,以便他們並不需要通過輔助站點上的cookie繼續登錄。設置自定義會話ID會導致script/apache掛起

顯然,我們通常會最終在我通過cURL調用,因此設置任何$_SESSION變量有沒有可用的輔助站點將文件不同session id;所以我嘗試通過session_id從輔助站點撥打cURL,然後在該文件中,我設置了會話ID,以便我設置的任何$_SESSION變量隨後可供輔助站點使用。

// Get session ID 
$sid = trim($_GET['session_id']); 

// Set the session id so we can get the added session data below via the forum 
session_id($sid); 

session_start(); 

然而,當我做到這一點,並嘗試訪問輔助站點的頁面將不會加載,它只是掛起 - 我試着刪除代碼,並再次加載它,但直到我重新啓動Apache它不會加載。

Btw ..如果它很重要,這是在我的本地開發機器,這是Windows XP專業版。

任何想法!?

回答

2

我在這裏假設您的主站點和輔助站點都在同一臺服務器上,並使用相同的會話設置,特別是相同的session.save_path,是否正確?
如果是這樣,這就是你的問題所在:

PHP的默認會話處理機制使用文件保存會話數據。

並避免會話文件併發寫入訪問,文件獲取鎖定只要一個腳本(一個腳本例如會更準確)仍與會議的工作。每個想要訪問特定會話的其他腳本都必須「等待」,直到第一個腳本完成使用會話。

因此,當您嘗試在輔助站點上使用主站點上已在使用的會話標識開始會話時,輔助站點上的腳本由於該鎖定而無法訪問會話。
而且,由於你的主站點的捲曲請求,等待二次腳本來完成,這本身就是還在等待訪問會話......你已經在這裏擁有屬於自己的漂亮的僵局:-)


你什麼可以這樣做,在您的主站點腳本之前調用session_write_close,然後在之前發出cURL請求 - 此時所有數據都寫入會話文件,並釋放文件鎖定。

但是,您必須意識到,之後您不能在主站點腳本實例中再次使用會話 - 呃,您仍然可以從$_SESSION數組讀取數據並將數據推送到數組中,但由於會話已經關閉後,在該點之後您在該數組中更改的所有數據將不會再被保留。因此,請在主腳本中處理會話,然後關閉會話 - 然後創建cURL請求。


編輯:好了,來想想吧 - 不知道上面實際上幫助這裏...因爲你的整個方法可能已經有缺陷的。在輔助站點上通過cURL調用腳本實際上並不會在用戶的瀏覽器中爲您的輔助域設置會話Cookie - 因爲該輔助站點腳本的每個響應都不會在瀏覽器中「登陸」,而是落在您的主站點腳本,因爲那是你從中請求的地方。

我認爲你真正需要的是從用戶瀏覽器(JavaScript/AJAX請求,iframe,嵌入圖像)的輔助站點中調用腳本,以便它可以在會話中設置cookie名稱和會話ID作爲值在您的輔助站點的域下 - 只有這樣,PHP才能夠在用戶的瀏覽器導航到輔助站點時「識別」用戶的瀏覽器。其實開幕會話將不是必要的(仍然假設這兩個網站使用相同的會話),因爲會話已經開始,並且它需要的所有PHP在輔助站點上挑選它是一個匹配的會話ID從cookie。

因此,嘗試這樣做,而不是 - 但要知道,你可能碰上這一說法,因爲瀏覽器會考慮該cookie對於作爲第三方的Cookie二級域名,當你試圖將其設置問題在你的主站點上下文(和域不匹配,例如一個不在另一個的子域上運行或類似的東西)。

+0

感謝您的深入響應。實際上,我最終通過相同的響應傳遞了所需的額外數據,並在輔助站點的腳本中設置了會話變量;更簡單的過程哈哈.....但我很感謝你的迴應,如果我再次遇到這樣的事情,它肯定會在未來派上用場。 – Brett