实现一种策略,以编程方式平衡我的PHP Web应用程序的负载

实现一种策略,以编程方式平衡我的PHP Web应用程序的负载,php,sql,performance,memory,load-balancing,Php,Sql,Performance,Memory,Load Balancing,大多数共享主机仅限于1GB虚拟内存,这并不多 我也遇到了类似的情况,我的脚本由于资源限制错误而被服务器终止,这对我们的应用程序造成了严重破坏(在一天中的某些时候几乎无法使用) 这是由服务器抛出错误(已达到资源限制)引起的 在CPANEL错误日志中,我得到了一大堆: "Cannot allocate memory: couldn't create child process: ..." 检查其他一切,带宽和磁盘空间,甚至CPU的使用都非常少,但这该死的内存限制才是致命弱点 这让我意识到

大多数共享主机仅限于1GB虚拟内存,这并不多

我也遇到了类似的情况,我的脚本由于资源限制错误而被服务器终止,这对我们的应用程序造成了严重破坏(在一天中的某些时候几乎无法使用)

这是由服务器抛出错误(已达到资源限制)引起的

在CPANEL错误日志中,我得到了一大堆:

    "Cannot allocate memory: couldn't create child process: ..."
检查其他一切,带宽和磁盘空间,甚至CPU的使用都非常少,但这该死的内存限制才是致命弱点

这让我意识到,对我(以及像我这样在有限服务器上的开发人员)来说,更重要的是设计我的应用程序,最大限度地减少内存使用,而不是速度、响应能力、近实时数据和其他优先级

因此,我正在重新设计

查看我的资源使用统计数据,我可以看到,虽然我的应用程序的内存确实超过1GB(甚至高达3GB),但这肯定不是恒定的,内存峰值是间隔开的,峰值不是由单个脚本或运行引起的,而是由同时堆积的小请求(1-2秒内4-5个请求)引起的

我几乎可以得出这样的结论:我的应用程序(几个同时进行的后端调用)不会消耗1GB,因此我不需要在我的服务器上使用更多内存(这比VPS要贵得多)。我需要的是找到一种更好的方式,在一天中“分散”负载(填补0%的内存使用缺口)

我无法控制并发连接和并发请求,它们只会不断出现(主要来自客户端应用程序,具体取决于我的数据服务器)

但是,如果我只是优雅地处理请求并自己管理它们,我可以通过抛出一个标志使前端客户机放弃请求并在几秒钟后重试,从而使ajax请求超出限制(即:5个同时请求)

这样,无论何时启动GUI/前端以及间隔开始计时,应用程序都将自我修复或自我组织并管理间隔,以使它们不会同时攻击服务器。这是额外的工作,但我宁愿自己终止调用,而不是服务器抛出资源限制错误

我已经有了一些关于如何执行这种“自我负载平衡行为”的想法,但我正在寻找最好的方法

基本上,我只需要一种方法来计算当前正在运行的呼叫总数。。基本上我需要办理入住/退房手续

我会有一个简单的日志记录当前正在运行的脚本数量。。就这样

这将在每个脚本的开头和结尾增加额外的读/写开销,但我认为这是一个很小的代价。。我有足够的CPU剩余电量


所以我想问社区关于我的情况还有什么其他的建议吗?更重要的是,跟踪这些毫秒执行的最节省内存的方法是什么?在文件(磁盘)上还是在一个小mySQL表上快速选择和更新SQL?使用单独/更快的数据库?虽然我认为那会消耗更多的记忆。我已经在连接和访问mySQL了,所以最好重新使用连接。再一次,在这一点上,我不再关心速度,缓慢和稳定的w/o内存错误,这就是目标

您得到的确切错误是什么?请将它们附加到您的问题中。简言之:您希望序列化当前并行的请求。最简单的方法是对共享资源使用锁。例如,需要所有您认为有问题的昂贵操作来获取为此目的生成的特定文件的锁。当锁已被占用时,您可以选择是阻止锁还是使锁失败。@cmorrissey-添加了一些错误详细信息。但基本上是服务器终止了我的脚本执行。booo@deceze-是的,这是一个非常简单但清晰的表达方式(我没想到,谢谢)。。序列化请求是我能想到的唯一解决方案。。否则,VPS=不是一个选项。所以您建议使用“锁定文件”,这意味着diskwrite方法优于SQL方法。。我可能会在一个专用文件夹中创建锁文件,让脚本进行文件计数,并以此作为继续或等待的条件。scandir非常快。同样,它锁定了所有共享资源。您也可以在SQL中创建表/行锁,但这可能更复杂。如果您想允许一定数量的并行请求,这也会变得更复杂。但是,为了简单地序列化任何和所有请求,在磁盘上锁定一个文件是非常简单和简单的,并且速度非常快?请将它们附加到您的问题中。简言之:您希望序列化当前并行的请求。最简单的方法是对共享资源使用锁。例如,需要所有您认为有问题的昂贵操作来获取为此目的生成的特定文件的锁。当锁已被占用时,您可以选择是阻止锁还是使锁失败。@cmorrissey-添加了一些错误详细信息。但基本上是服务器终止了我的脚本执行。booo@deceze-是的,这是一个非常简单但清晰的表达方式(我没想到,谢谢)。。序列化请求是我能想到的唯一解决方案。。否则,VPS=不是一个选项。所以您建议使用“锁定文件”,这意味着diskwrite方法优于SQL方法。。我可能会在一个专用文件夹中创建锁文件,让脚本进行文件计数,并以此作为继续或等待的条件。scandir非常快。同样,它锁定了所有共享资源。您也可以在SQL中创建表/行锁,但这可能更复杂。如果您想允许一定数量的并行请求,这也会变得更复杂。但是