PHP处理并发


PHP dealing with concurrency

我正在运行一个企业级PHP应用程序。这是一款拥有数千名在线用户的网页游戏,其基础设施我的老板拒绝升级,并且机器始终运行在2-3个系统负载(是的linux)上。无论如何,这不是真正的问题。真正的问题是,一些用户等到服务器加载完毕(黄金时间),他们带着鼠标点击器,点击同一个提交按钮10-20次,在服务器仍在产生初始请求的同时发送10-20个请求,因此没有更新缓存和数据库。

目前我在每个请求上都有一个输出变量,有效期为2分钟,我有"互斥锁",基本上是memcache内的一个标志,如果发现阻塞了脚本的执行,但是鼠标点击器同时发出了这么多请求,它们几乎同时运行,这对我来说是一个大问题。

你是如何,大多数StackOverflow的人处理这个问题。我正在考虑标记cookie/会话,但我认为如果服务器过载,我会遇到同样的问题。优化是不可能的,源代码是7年前的,并且经过了相当的优化,在大多数页面上没有查询(耗尽缓存),只在某些用户输入上查询数据库,就像我试图阻止的那样。

是的,它是没有真实对象的过程代码。机器运行PHP 5,但代码本身更像是PHP 4。我知道,我知道这是旧的东西,但我们不能腾出资源重写整个混乱的东西,因为大多数原始开发人员都知道东西是如何交织在一起的,是的,我基本上是在修补旧的漏洞。但据我所知,这是加载PHP网站的普遍问题。

p。S:在提交时用javascript禁用按钮不是一个选项。真正的骗子是高级用户。其中一个人写了一个机器人点击器,并将其打包为谷歌Chrome扩展。别问我是怎么处理的。

我会在你的代码之外寻找解决方案。

不知道你用的是哪个服务器,但是apache有一些模块,比如mod_evasive

您还可以在防火墙中限制IP的每秒连接数

我感觉这篇文章更多地涉及如何更新遗留代码库,而不是其他内容。虽然实现某种类型的并发性很好,但旧的代码库才是真正的问题。

我强烈推荐这个讨论技术债务的视频。

看,如果你还没有看,那么用商业术语向你的老板解释技术债务是什么。他可能会理解这一点。解释一下,因为代码没有得到很好的管理(债务偿还了),所以有很高的技术债务。向他/她建议如何通过使用小的增量迭代来改进事情来解决这个问题。

限制IP连接只会让你的玩家生气。我在一些著名的开源游戏克隆中使用旧风格代码修复和重写了许多内容:嗯,我必须说作弊总是可以避免执行正确的查询和逻辑。例如看这里http://www.xgproyect.net/2-9-x-fixes/9407-2-9-9-cheat-buildings-page.html

无论如何,关于性能,请记住会话中的代码将阻塞所有其他线程,直到当前线程关闭。因此,要小心将所有代码放入会话中。此外,会话不应该包含大量数据。

关于脚本:在我的游戏中,我有一个php模块,自动重写链接添加一个随机id保存在数据库中,一种csrf保护。人类用户将点击更改的链接,所以他们不会看到更改,但脚本将尝试要求旧链接,并在一些尝试后有禁止!其他脚本使用DOM,因此很容易避免它们在页面周围插入一些无用的DIV。

编辑:你可以提升你的应用https://github.com/facebook/hiphop-php/wiki

我不知道是否已经有了实现,但我正在考虑编写一个缓存服务器,它负责在缓存丢失时填充自己。这种方法在这种情况下可以很好地工作。

基本上你需要一种机制来标记缓存槽为未命中挂起;对挂起值的读取应该导致客户端休眠一小段但随机的时间并重试;在传统模型中,等待数据的填充将由客户端遇到miss而不是等待来完成。

在这里,脚本是客户端,而不是浏览器。