Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 配置Apache和MySQL,为客户端提供并行和可取消的服务_Php_Mysql_Apache - Fatal编程技术网

Php 配置Apache和MySQL,为客户端提供并行和可取消的服务

Php 配置Apache和MySQL,为客户端提供并行和可取消的服务,php,mysql,apache,Php,Mysql,Apache,我们有一个客户机-服务器体系结构,客户端为Angular,服务器端为Apache2 PHP PDO和MySQL。服务器端向客户端公开API,为客户端提供数据以供显示 一些意见: 一些API调用可能需要很长时间来计算和返回响应 服务器端似乎在任何给定的时间处理每个客户机的单个请求(我只看到在mysql中执行的一个共同响应查询),这一限制来自apache或mysql,因为前端肯定会并行发送请求 前端取消不再相关的请求(正在获取的数据将不可见) 似乎前端取消的请求在服务器端不会被取消,并且会继续运行,

我们有一个客户机-服务器体系结构,客户端为Angular,服务器端为Apache2 PHP PDO和MySQL。服务器端向客户端公开API,为客户端提供数据以供显示

一些意见:

  • 一些API调用可能需要很长时间来计算和返回响应
  • 服务器端似乎在任何给定的时间处理每个客户机的单个请求(我只看到在mysql中执行的一个共同响应查询),这一限制来自apache或mysql,因为前端肯定会并行发送请求
  • 前端取消不再相关的请求(正在获取的数据将不可见)
  • 似乎前端取消的请求在服务器端不会被取消,并且会继续运行,我认为即使它们排队,当轮到它们时,它们仍然会运行(即使它们在客户端被取消)
  • 需要帮助了解:

  • 不让所有请求(或至少X>1个请求)并行运行的具体原因是什么?可以改变吗
  • 为了克服这个问题,我应该在apache或mysql中更改哪些配置
  • 有没有办法让apache删除取消的请求?至少那些仍在排队且未启动的
  • 谢谢

    编辑


    以下是@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已经在大嚼它了

    拿着“罐头”