2012-01-05 67 views
3

這可能似乎是一個很簡單的問題,我可能會知道,如果我有電腦過程等進行更深入的瞭解,但不管怎麼說..服務器上的PHP頁面是否同時運行?

如果兩個人從我的服務器請求同樣的頁面, PHP頁面是爲第一個人處理一次,然後是第二個人爲第二個人處理,還是可能在同一時間彼此並排?

以此爲例。我在PHP驅動的在線商店中留下了一個庫存物品。用戶將其添加到他們的購物車。 Php腳本1)檢查是否有庫存,是的,它的庫存,所以它2)爲他保留它。

如果在檢查其庫存和保留它之間是否有相同的PHP頁面正在爲其他人加載,並且在用戶A檢查庫存是否正確之後,用戶B在用戶A得到有機會保留它,所以他們最終保留它!

對不起,如果這看起來很傻,似乎無法找到答案,這是什麼?

+2

聽起來像你需要了解交易... – 2012-01-05 03:30:35

+1

嗨,米克。請不要在你的帖子上簽名。誠摯的, – 2012-01-05 03:34:09

+0

非常感謝您的建議傢伙。所以只是想,有什麼辦法可以限制它,所以一次只能打開一個數據庫連接?並在數據庫級別執行此操作?如果一個腳本試圖打開一個數據庫連接,並且一個已經打開,那麼MYSQL在打開連接之前暫停。 – user1020317 2012-01-05 03:44:35

回答

7

恭喜,您已經確定了race condition! :-)

PHP頁面是並行運行還是依次運行取決於Web服務器。通常,Web服務器會分配多個線程來同時處理多個傳入請求。因此,如果兩個或多個用戶同時請求同一頁面,可能會發生同一腳本的多個實例並行運行。由於時間安排和時間安排的不同,每個頁面都會精確執行哪個操作是不可預測的。

因此,對於您描述的這種情況,以原子方式對行爲進行編程非常重要,這意味着它們要麼全部完成,要麼根本不完成。在你的情況下,你可以使用鎖,交易,巧妙地形成UPDATE報表,UNIQUE索引或許多避免兩個用戶保留同一事物的可能性的其他技術。

+0

您能詳細解釋一下「他們要麼全部完成,要麼完全不完成」。這在上下文中如何起作用?如上所述,從數據庫請求相同參數的兩個scritpt可能仍然會導致雙重「庫存」情況...正確!?! – Matte 2012-12-04 14:07:03

-1

是和否。根據服務器設置的不同,PHP可以同時運行,但是在小規模情況下,只能有一個數據庫。數據庫查詢是按順序處理的,所以你永遠不會有這種衝突。 (只要您在爲某人預訂之前檢查某件商品是否有庫存)More information

當然,用戶A + B可能都會看到它有貨,而A可能會在B之前請求它。但是你的代碼可以認識到它現在缺貨並向用戶B顯示一個錯誤。

(你在多個數據庫服務器上遇到問題如果你有多個服務器存儲相同的數據,但是你不會有這個問題,我們在這裏說的就是1000個網站。)

+0

那麼,你的*當然*子句恰好是問題的要點,它是由腳本並行運行引起的,即使是小規模的。數據庫查詢不一定按順序處理,這非常依賴於數據庫。 – deceze 2012-01-05 03:35:18

+0

php可能會同時運行這兩個腳本,但是一個數據庫連接將限制此問題。第一個問題應該回答是;) – 2012-01-05 03:36:31

+0

請參閱http://stackoverflow.com/questions/4980801/how-simultaneous-queries-are-handled-in-a-mysql-database。 – deceze 2012-01-05 03:42:29

2

是的,一般來說,沒有太多細節:PHP sc分別爲每個請求同時執行ripts

爲了確保您提到的問題沒有發生,您應該實施名爲「事務」的數據庫管理系統的功能。這樣,如果你在數據庫層上做了一些事情,並且最終你會發現預訂不會發生,那麼在事務中所做的所有操作都將被回滾。

除了交易你應該設計你的應用程序記住你提到的問題可能發生。因此,您應該設計數據庫應用程序,以便您1)儘可能縮短「檢查」和「預約」之間的時間,2)如果您不能預約,則停止操作,最後 - 在緊急情況下 - 3)確定哪個預約先到,哪個應該撤銷。

另一個想法,落入「您的應用程序的設計」類別中,可能有一些我們可以稱之爲「臨時預約」。這意味着如果您要預訂,您可以暫時(例如幾秒鐘)鎖定您的預訂。之後,您可以檢查您是否真的可以預訂,並將其轉爲永久預訂或僅撤銷預訂。我相信一些系統也會在客戶開始預訂他/她的位置之後立即做出更長時間的臨時預訂。然後,如果過程成功,則預訂變爲永久,但如果某些特定時間過去而沒有成功,則可以簡單地撤消預約,從而允許另一個客戶開始該過程。

-1

是的,他們是平行的php,但是當數據庫關心你應該學習數據庫管理系統的事務部分。

+0

展開並證明。 – 2012-01-05 03:34:22

+0

我說有沒有必要擔心只有PHP。但是當數據庫擔憂時,您應該擔心正確的事務管理。 – 2012-01-05 03:37:35

+0

是的,我知道你做了 - 你剛剛重新安排你的話。但這只是一個斷言。 – 2012-01-05 16:11:26

相關問題