2013-11-24 61 views
0

如果您熟悉像VB.NET這樣的編程語言,那麼您知道在不同的應用程序實例之間共享名稱Shared-Memory。我的問題是:會話變量在PHP中的行爲是否相同?會話變量是否在共享內存中?


假設這樣的場景:

我在的網站的鏈接上點擊兩次(兩個請求與相同的頭文件,同樣的Cookie,但在不同的時間發送)。 $_SESSION['num']設置爲0現在:

在12:00:00.01第一請求是由服務器接收的
在12:00:00.03第一請求開始其會話
在12:00:接收00.04秒請求由服務器
在12:00:00.05第二個請求開始其會話。
12:00:00.06第一個過程將10添加到值$_SESSION['num']
在12:00:00.07秒處理將10添加到值$_SESSION['num']
12:00:00.09兩個過程都完成了。

現在,有兩種可能的答案:$_SESSION['num']10$_SESSION['num']是20.哪一個是答案?

+0

快速回答:沒有。至於你的例子,這完全取決於每個請求是否共享同一個會話 – Phil

+0

@Phil我說我**點擊了兩次鏈接**,這意味着它們都使用相同的會話! – undone

+0

啊,我的道歉。 「點擊」就是這樣一個模糊的術語。沒有進一步的信息,比如使用哪個瀏覽器,標籤等,我不想妄下結論。那麼答案是20. – Phil

回答

2

你的問題的通常答案是「當你測試它時發生了什麼?」

PHP將存儲您的會話wherever you tell it to存儲會話:文件,共享內存,數據庫。默認情況下它使用文件。當您調用session_start()時,會話將從存儲中檢索,當您調用session_write_close()時會將其寫回存儲器,或腳本退出。

如果會話處理程序獲取存儲上的鎖定,則第二個實例將被阻塞,直到第一個實例回寫更改爲止。默認文件處理程序acquires locks

+0

我無法測試它,因爲我無法發送同時請求!但是,謝謝! – undone

+0

爲什麼不呢? (提示:看一下sleep()函數)。 – symcbean

+0

我試過了,但似乎瀏覽器不同時發送請求。他們等待第一個請求完成,然後啓動另一個! – undone

相關問題