我正在运行企业级PHP应用程序。这是一个浏览器游戏,在基础设施上有成千上万的用户在线,我的老板拒绝升级,机器在任何时候都运行2-3系统负载(yep linux)。无论如何,这不是真正的问题。真正的问题是有些用户等到服务器加载(黄金时间)并且他们带着他们的鼠标答题器他们点击相同的提交按钮10-20次,同时在服务器静止的同时发送10-20个请求产生初始请求,因此不更新缓存和数据库。
目前我在每个请求上都有一个输出变量,它有效2分钟,我有“互斥锁”,这基本上是一个memcache里面的标志,如果发现它会进一步阻止脚本的执行,但鼠标点击器会这样做许多请求同时几乎同时运行,这对我来说是个大问题。
你是多少,StackOverflow的大多数人都在处理这个问题。我在考虑标记cookie /会话,但我认为如果服务器过载,我会遇到同样的问题。优化是不可能的,源是7年并且相当优化,在大多数页面上没有查询(运行缓存)并且仅在某些用户输入上查询数据库,就像我试图阻止的那样。
是的,它是没有真实对象的程序代码。机器运行PHP 5,但代码本身更像是PHP 4.我知道,我知道它已经很老了,但是我们无法省去重写这整个混乱的资源,因为大多数原始开发人员都知道如何将东西交织在一起是的,我基本上是修补旧洞。但据我所知,这是加载PHP网站的一般问题。
P.S:在提交时禁用带有javascript的按钮不是一个选项。真正的骗子是高级用户。其中一人编写了一个机器人点击器并将其打包为Google Chrome扩展程序。不要问我是如何处理的。
答案 0 :(得分:1)
我会寻找代码之外的解决方案。
不知道你使用的服务器,但apache有一些模块,例如mod_evasive。
您还可以限制防火墙中每秒的连接数
答案 1 :(得分:1)
我感觉这更像是如何更新遗留代码库而不是其他任何东西。虽然实现某种类型的并发性会很好,但旧代码库是您真正的问题。
我强烈推荐讨论技术债务的this video。
观察它,如果你还没有,请从业务角度向你的老板解释技术债务是什么。他很可能会理解这一点。解释一下,由于代码管理不善(偿还债务),技术债务水平非常高。建议他/她如何通过使用小的增量迭代来解决这个问题。
答案 2 :(得分:0)
限制IP连接只会让玩家生气。 我使用旧样式代码在一些着名的开源游戏克隆中修复并重写了很多东西: 好吧,我必须说作弊总是可以避免执行正确的查询和逻辑。 例如,请查看此处http://www.xgproyect.net/2-9-x-fixes/9407-2-9-9-cheat-buildings-page.html
无论如何,关于性能,请记住会话中的代码将阻止所有其他线程,直到当前的一个被关闭。因此,请小心将会话中的所有代码转换为会话。此外,会话不应包含大量数据。
关于脚本:在我的游戏中,我有一个php模块,可以自动重写链接,添加保存在数据库中的随机ID,这是一种CSRFprotection。人类用户将点击更改的链接,因此他们不会看到更改,但脚本会尝试询问旧链接,经过一些尝试后会被禁止! 其他脚本使用DOM,因此很容易避免它们在页面周围插入一些无用的DIV。
来增强您的应用答案 3 :(得分:0)
我不知道是否已经有了实现,但我正在考虑编写一个缓存服务器,负责填充缓存未命中。在这种情况下,这种方法可以很好地运作。
基本上你需要一种机制来将一个缓存槽标记为未命中;读取待处理的值应该导致客户端睡眠很小但随机的时间并重试;传统模型中未决数据的数量将由客户遇到未命中而不是未决。
在此上下文中,脚本是客户端,而不是浏览器。