我正在构build一个Web应用程序。 我有一个用PHP编写的ElasticSearch和REST API索引的书籍数据库。
在应用程序中,有一个search框,在那里input书名,JS脚本调用search请求,而search请求使用ElasticSearch的search查询运行curl请求。
问题是,当用户键入的速度太快,请求太多。 它开始减速,即使正常的单个请求持续大约200毫秒,也会延长到5-10秒,这个时间太长了。 我可以运行更less的请求,但我希望即时反馈。
所以我问 – 在我的服务器上,curl的核心是否一次只运行一个请求,即使它们是在不同的PHP请求中调用的,还是其他的东西?
简短的回答是,它不是asynchronous的。 较长的答案是“除非你自己写了后端”。
如果你使用XHR,每个请求将在后端有一个不同的工作线程,这意味着没有请求应该阻止其他任何请求,除非有进程和内存限制。 虽然XHR提供了基于事件的接口,但它仍然是一个由浏览器同步处理的实时HTTP请求(您只能在js中获得1个线程)。 php后端也同步进行curl调用,直到curl调用完成才返回XHR的http请求结果。 现在,你可以设置你的JavaScript轮询结果,但由于你的生存时间<3-5秒,这是不值得的。
如果你使用的是websocket,那么你必须告诉我们。 给定的websocket绑定到后端的一个进程,但是你可以在那个进程中fork / thread /做任何事情。 它还允许您直接将事件推送到浏览器,而无需客户端发起请求。 这可能是asynchronous的,但是如果放慢是在你的后端,它不会帮助改变到asynchronousdevise。
实际上,你应该让你的客户端的JavaScript等待发布下一个search,直到最后的search返回。 为防止DOS,如果单个客户端开始发送太多的完成search请求,则开始使用HTTP 429删除请求,并在JS中处理429个响应,以执行增量退避,并在适当的时候重试。
另一件你应该做的事情就是把curl中的请求超时设置为更低的值,以便适当地超时。 如果search数据仅用于2-3秒,那么您的curl请求超时应该大致相同。 如果你的后端足够聪明,它会解释一个closures的连接意味着“停止search”,希望你能够及时的停止资源的丢失,让另一个进程使用它们。
我了解它的方式,你有一个networking服务器,运行一些可用于自动完成的脚本。 该脚本使用cURL针对另一台服务器运行查询。
首先,回答你的问题:你的web服务器很可能并行运行多个PHP进程,并且由于cURL被PHP调用,它也可以并行运行。 你没有告诉你运行哪个web服务器,但大多数支持这个。
但是,它看起来像你的设置是相当networking密集型的:每个按键将产生一个请求到您的服务器,这将产生一个请求到另一台服务器。 如果你的服务器缺less资源,或者如果另一台服务器有一个限速器,你将会得到不好的性能。 也许caching结果在您的networking服务器(所以你不必经常curl)或让你的Javascript等待几毫秒,以便快速的人不会触发太多的请求。