2013-05-29 128 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

我不知道是否已经有一个实现,但我正在研究编写一个缓存服务器负责填充缓存未命中。这种方法在这种情况下可以很好地工作。

基本上你需要一个机制来标记一个缓存槽作为挂起的未命中;读取挂起的值应该导致客户端睡眠一小段但随机的时间并重试;传统模型中待处理数据的数量将由客户端遇到未命中而未完成。

在这种情况下,脚本是客户端,而不是浏览器。