繁体   English   中英

如何处理从一个客户端到一个 PHP 脚本的多个并行请求

[英]How to process multiple parallel requests from one client to one PHP script

我有一个网页,当用户访问它时,会立即向单个 PHP 脚本发出多个 (10-20) Ajax 请求,该脚本根据请求中的参数返回具有高度聚合数据的不同报告。

问题是很多报告需要大量的 SQL 调用来获取必要的数据,在某些情况下,报告可能需要几秒钟才能加载。
结果,因为一个客户端向同一个 PHP 脚本发送多个请求,您最终会看到报告一次一个地缓慢加载到页面上。 换句话说,报告的生成不是并行完成的,因此导致页面需要一段时间才能完全加载。

有没有办法在 PHP 中解决这个问题,并使从单个客户端到单个 PHP 脚本的所有请求都可以并行处理,以便可以更快地加载页面及其所有报告?

谢谢你。

据我所知,可以在 PHP 中进行多线程处理 看看pthreads 扩展

您可以做的是使脚本的报告生成部分/功能并行执行。 这将确保每个函数都在其自己的线程中执行,并且会更快地检索结果。 此外,将最大并发线程数设置为 <= 10,这样它就不会成为资源占用者。

是一个让您开始使用 pthreads 的基本教程。

而一些更多的例子可能(在你的情况下,值得注意的是,SQLWorker例子)有所帮助

服务器设置

这更多是服务器配置问题,取决于系统上 PHP 的安装方式:如果使用php-fpm ,则必须增加pm.max_children选项。 如果您通过 (F)CGI 使用 PHP,则必须配置网络服务器本身以使用更多子项。

数据库

您还必须确保您的数据库服务器允许运行许多并发进程。 如果您有足够多的 PHP 进程在运行,但其中一半必须等待数据库注意到它们,这将没有任何好处。

例如,在 MySQL 中,它的设置是max_connections

浏览器限制

您面临的另一个问题是浏览器不会对同一主机执行 10-20 个并行请求。 这取决于浏览器,但据我所知,现代浏览器只能同时打开 2-6 个到同一主机(域)的连接。 因此,无论服务器配置如何,任何更多的请求都会排队。

备择方案

如果您使用 MySQL,您可以尝试将所有调用合并到一个请求中,并使用mysqli::poll()使用并行 SQL 查询。

如果这不可能,您可以尝试在 PHP 脚本中调用子进程或分叉。

当然 PHP 可以并行执行多个请求,如果它使用像 Apache 或 Nginx 这样的 Web 服务器。 PHP 开发服务器是单线程的,但这无论如何都应该用于开发。 但是,如果您正在使用 php 的文件会话,则对会话的访问是序列化的。 即,任何时候只有一个脚本可以打开会话文件。 解决方案:在脚本启动时从会话中获取信息,然后关闭会话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM