2010-01-13 85 views
2

我已經讀過PHP「可能」的弱點是它如何處理「併發」。只有會話和cookies來保存用戶狀態的跟蹤,怎樣才能PHP高精度處理以下情況:PHP爲「高流量」網站

  1. 多個用戶簽出與只有1庫存股票一個項目(語法錯誤對不起,但你很可能找到一些圖片)

  2. 多個用戶使用相同的登錄信息

  3. 多個用戶編輯在同一時間同一圖像(雖然這種情況很少在現實情況登錄到同一用戶帳戶生活)

,或者需要多線程處理

(我很抱歉,如果我在這裏濫用條款)

+4

如何這只是PHP的限制 - 這是在計算機科學領域的共同問題。 – 2010-01-13 02:59:20

+0

不java有類處理線程,鎖,信號等? PHP有這些嗎? (如果它們存在,還沒有真正發現它們) – yretuta 2010-01-13 03:01:25

+0

否 - 但它可以訪問memcached(可以模擬互斥/信號量)和數據庫。 競爭條件和鎖定可以在許多層解決,包括PHP,數據庫和緩存。 – 2010-01-13 03:05:23

回答

4

的責任移除這些都不是真正的併發問題。雖然PHP作爲一種環境確實缺乏線程能力,但任何使用PHP模塊的Web服務器都會有多個線程,每個線程都有自己的活動PHP環境,它們都使用相同的資源。您將遇到Java,.Net,Perl或任何其他Web應用程序語言的這些問題。

  1. 您需要在您的數據庫上有一個事務,可能帶有寫鎖定,以便其他用戶無法讀取它並在別人正在簽出時運行結帳過程。這不是一個語言線程問題,它是一個數據庫事務問題。
  2. 這也不是線程問題。會話對於所有可用的工具來說都是微不足道的,我從來沒有聽說過任何語言平臺上的「每個會話都有一個線程」的實施方式(這將是不平凡的,難以實施的,並且會增加開銷)。您可以允許多個會話令牌對於一個帳戶處於活動狀態(用戶可以在不同的選項卡或Web瀏覽器上多次登錄(如果他們需要的話),或者您不會)(每次發生登錄過程時都會清除所有會話令牌,一個令牌處於活動狀態)。
  3. 很奇怪,但我不確定線程​​是如何適合這裏的。圖像編輯必須在瀏覽器中完成客戶端。你不能讓任何語言的「線程」對用戶的瀏覽器保持開放...... HTTP不能像那樣工作。你會發送他們的形象,你完成了,直到他們擊中「保存」並將其發回。如果您擔心用戶覆蓋對方的更改,那麼您只需將事務鎖定在其上。我可能只是「版本」每個圖像,如果一個用戶發生更新而另一個用戶正在編輯它,則會通知其他用戶他們需要刷新其副本。

據我所知,沒有語言使用線程來完成任何這些任務。由於HTTP通訊的無狀態特性,餅乾會話的網絡語言的中流砥柱,所以無論你使用什麼平臺,你會看到很多在所有這些相同的策略來處理一個給定的問題。

5

這些不一定是PHP的問題,任何其他交易。鑑於任何選擇的技術,這些都是開發人員需要克服的問題。

  1. 讓他們的庫存達到1的用戶不是PHP的錯。當有人已經將它添加到購物車時,你可以暫時忽略這個1,如果它們在會話過期之前沒有購買它,就可以將其釋放。
  2. 好嗎?您可以註銷其他用戶或管理所有會話。
  3. 同樣,他們可能不會在相同的微型計時器上做它。如果他們這樣做,拋出一個很好的錯誤,並要求他們再試一次。正如在評論中指出的那樣,MySQL有足夠的能力來處理這些類型的事件(如果它們發生的話)。
+2

不要忘記你的數據庫可以做交易和鎖定,對於那些需要110%確定沒有任何事情發生的情況。 – 2010-01-13 03:04:30

0

就像所有語言一樣,您需要找到某種方式來鎖定這些文件。如果你並不熟悉併發性,你可能會從here開始,並對可用的不同方法進行一些研究。

但我真正的問題是這是否真的會成爲一個問題。如果你將要進入一個高併發系統,碰撞情況下的損害有多高。如果碰撞的成本非常高,那麼可能會將工作外包給已經切斷牙齒的人,只是看他們使用的方法。

1
  1. 你的數據庫應該原子處理事務,並刪除最後一個項目,從PHP
0

你有沒有聽說過數據庫事務?正確使用,這些可以解決您的所有問題(順便說一句,這不是PHP的問題)。

0

如果你的問題是關於交易,那麼答案是肯定的,但它不是語言本身的特點。交易安全是數據庫層的任務(通常是像MySQL這樣的關係數據庫)。

但是,如果我看了你的問題,如「PHP是可擴展的?」,那麼答案也是肯定的。

PHP處理「併發」只是儘可能完美,因爲它完全隱藏來自應用程序,這是Web應用程序是一件好事任何併發相關細節。它使應用程序具有固有的可擴展性,就像HTTP使「web」可擴展一樣。 HTTP是無狀態的,因此PHP在某種意義上是無狀態的。這容易實現橫向可伸縮性,例如通過添加更多硬件而不改變應用程序代碼(雖然這仍然需要一些應用程序支持)。

查閱這些greatarticles一個解釋。