Php 配置Apache和MySQL,为客户端提供并行和可取消的服务
我们有一个客户机-服务器体系结构,客户端为Angular,服务器端为Apache2 PHP PDO和MySQL。服务器端向客户端公开API,为客户端提供数据以供显示 一些意见:Php 配置Apache和MySQL,为客户端提供并行和可取消的服务,php,mysql,apache,Php,Mysql,Apache,我们有一个客户机-服务器体系结构,客户端为Angular,服务器端为Apache2 PHP PDO和MySQL。服务器端向客户端公开API,为客户端提供数据以供显示 一些意见: 一些API调用可能需要很长时间来计算和返回响应 服务器端似乎在任何给定的时间处理每个客户机的单个请求(我只看到在mysql中执行的一个共同响应查询),这一限制来自apache或mysql,因为前端肯定会并行发送请求 前端取消不再相关的请求(正在获取的数据将不可见) 似乎前端取消的请求在服务器端不会被取消,并且会继续运行,
以下是@Markus AO评论(谢谢Markus!!!)这是与会话阻塞相关的。。。但愿我以前知道 OP有许多复杂的问题摆在桌面上。然而,我觉得这些都是值得关注的问题(我自己也曾与它们搏斗过),所以让我们把它们分开。为了大正义;主屏幕打开: 解决并发请求问题 (L)AMP堆栈中的并发连接存在几个可能的问题和解决方案。然而,在研究Apache和MySQL的调优之前,让我先解释一下一个常见的“神秘”问题,它会造成并发问题;也就是说,一种必要的邪恶称为“PHP会话锁定” PHP会话阻塞和并发请求 简而言之:当您在应用程序中使用会话时,在调用
session\u start()
后,PHP会锁定存储在会话.save\u path
目录中的会话文件。在脚本结束或调用session\u write\u close()。结果:同一用户的任何后续调用都将排队,而不是并发处理,以确保没有会话数据损坏。(想象并行脚本写入相同的$\u会话
!)
演示这一点的一个简单方法是创建一个长时间运行的脚本;然后在浏览器中调用它;然后打开一个新选项卡,再次调用它(或者实际上,调用任何共享相同会话cookie/ID的脚本)。您将看到,在第一个调用结束之前,第二个调用不会执行。这是导致奇怪AJAX延迟的常见原因,特别是对于来自单个页面的并行AJAX请求。处理将是连续的,而不是并发的。然后,每次0.3秒的10次通话总共需要3秒才能结束,以此类推。我们不想那样,是吗
您可以通过确保:
使用会话的脚本在存储会话数据后应调用session\u write\u close()
。会话锁将立即释放
不需要会话的脚本不应该开始会话
只需要读取会话数据的脚本:使用session\u start()
和['read\u and\u close'=>true]
选项将为您提供一个只读(非持久性)$\u session
变量,而无需会话锁定。(从PHP 7开始提供。)
选项1和3将为$\u会话
变量提供读取权限,并释放/避免会话锁。会话关闭后对$\u会话所做的任何更改都将被自动放弃;不显示任何警告/错误
会话锁定请求阻塞问题仅对单个用户(使用同一会话)有影响。它对多用户并发没有影响。如需进一步阅读,请参阅:
- 因此:
- 因此:
- 深度:
Apache和MySQL并发请求
曾几何时,在意识到PHP是阻塞/排队并发调用背后的罪魁祸首之前,我花了一小段时间调整Apache和MySQL,想知道会发生什么
Apache2.4默认支持150个并发请求;任何进一步的请求都将排队。MPM/多处理模块下有多个设置,您可以调整这些设置以支持所需的并发连接级别。请参阅:
MySQL有(默认151)和(默认无限制)选项。如果您的应用程序为每个用户发送大量并发请求,则需要确保全局最大连接数足够高,以确保少数用户不会占用整个DBMS
显然,您还需要根据服务器CPU/RAM规格进一步调整这些设置。(计算结果超出了这个答案。)您的并发问题可能不是由以下原因引起的,但是,嘿,您永远不知道
取消对Apache/PHP/MySQL的请求
就您的应用程序的具体连接而言,我们没有太多的工作要做,但我从评论中了解到,目前为止,用户可以在前端取消请求,但不采取后端操作。(即,任何后端响应都将被忽略/丢弃。)
“有没有办法让Apache删除取消的请求?”我假设您的前端直接向Apache发送请求,并且不会延迟;然后转到PHP>MySQL>PHP>Apache。在这种情况下,不,您不能让Apache取消已经收到的请求;或者你可以点击“停止”,但很有可能PHP和MySQL已经在大嚼它了
拿着“罐头”