2013-05-29 44 views
6

我正在運行企業級PHP應用程序。這是一個瀏覽器遊戲,在我的老闆拒絕升級並且機器在任何時候都在2-3系統負載(yep linux)上運行的基礎架構上有成千上萬的用戶在線。總之,這不是真正的問題。真正的問題是,有些用戶等待服務器加載(黃金時間),他們帶來他們的鼠標答題器,他們點擊相同的提交按鈕10 - 20次,同時發送10-20請求,同時服務器仍然是產生初始請求,從而不更新緩存和數據庫。PHP處理併發性問題

目前我有每個請求的輸出變量,這是有效的2分鐘,我有「互斥鎖」,這基本上是一個標誌內memcache,如果發現阻止進一步腳本的執行,但鼠標喀makes聲如此多的請求,他們幾乎同時運行這對我來說是一個大問題。

你是怎麼回事,大多數StackOverflow的人都在處理這個問題。我正在考慮標記Cookie /會話,但如果服務器超載,我想我會遇到同樣的問題。優化是不可能的,源代碼已經7年了,並且已經過優化,大多數頁面都沒有查詢(從緩存中運行),並且只能在某些用戶輸入上查詢數據庫,就像我試圖阻止的那樣。

是的,它是沒有真正的對象的程序代碼。機器運行PHP 5,但代碼本身更多的是PHP 4.我知道,我知道這是舊的東西,但我們無法騰出重寫這整個混亂的資源,因爲大多數原始開發人員都知道這些東西是如何交織在一起的是的,我基本上修補舊洞。但據我所知這是加載PHP網站的一般問題。

P.S:禁用javascript提交按鈕不是一個選項。真正的騙子是高級用戶。其中一人寫了一個機器人點擊器,並將其打包爲Google Chrome擴展程序。不要問我如何處理。

+3

你是怎麼處理那個..? :) –

+2

我使用websockets。每個請求進程模型對這類事情來說都很不合適。 – rdlowrey

+0

好的應用程序是舊的,它沒有現代網站使用的花哨的MVC/Bigpipe/JSON/HTML5歷史thingie。它有太多的「修補程序」,只是把這個接口放在 – Sk1ppeR

回答

1

我會尋找你的代碼之外的解決方案。

不知道你使用了哪個服務器,但apache有一些像mod_evasive這樣的模塊。

您還可以限制從一個IP每秒連接在你的防火牆

+0

我使用Nginx和PHP作爲CGI P.S:我沒有倒下你 – Sk1ppeR

0

限制IP連接,只會讓你的球員憤怒。 我修復了一些着名的開源遊戲克隆中的很多東西,舊版代碼: 好吧,我必須說,作弊總是可以避免執行正確的查詢和邏輯。 例如看這裏http://www.xgproyect.net/2-9-x-fixes/9407-2-9-9-cheat-buildings-page.html

無論如何,關於性能,請記住裏面的會議將阻止所有其他線程,直到當前的一個被關閉的代碼。因此,請小心所有代碼在會話中。同時,會話不應包含繁重的數據。

關於腳本:在我的遊戲中,我有一個php模塊,自動重寫鏈接,添加一個隨機ID保存在數據庫中,一種CSRFprotection。人類用戶將點擊已更改的鏈接,以便他們不會看到更改,但腳本會嘗試請求舊鏈接,並在嘗試之後禁止!其他腳本使用DOM,所以很容易避免它們在頁面周圍插入一些無用的DIV。

編輯:你可以提高你的應用程序與https://github.com/facebook/hiphop-php/wiki

1

我得到這個更觸及了更新舊的代碼庫比什麼都重要的感覺。雖然實現某種類型的併發會很好,但舊代碼庫是您真正的問題。

我強烈建議this video討論技術債務。

看看吧,那麼如果你還沒有,在業務方面向你的老闆解釋什麼技術債務是。他可能會理解這一點。請解釋,由於代碼管理不善(償還債務),技術債務水平非常高。建議他/她如何通過使用小增量迭代來改善事情來解決這個問題。

+0

這段視頻是點亮的。 –

0

我不知道是否已經有一個實現,但我正在研究編寫一個緩存服務器負責填充緩存未命中。這種方法在這種情況下可以很好地工作。

基本上你需要一個機制來標記一個緩存槽作爲掛起的未命中;讀取掛起的值應該導致客戶端睡眠一小段但隨機的時間並重試;傳統模型中待處理數據的數量將由客戶端遇到未命中而未完成。

在這種情況下,腳本是客戶端,而不是瀏覽器。