PHP中的异步数据库/服务调用:Gearman与pthreads

在我们的LAMP站点上,我们遇到一些问题,一些服务必须多次调用数据库来提取数据.通常这种方式在PHP中完成(至少我的经验)是连续的;这显然效率低下.我们可以通过使用缓存和聚合某些查询来缓解一些低效问题;但在某些情况下,我们仍然需要进行多个数据库调用.

理想情况下,我会尽可能多地同时向数据库或Web服务发送尽可能多的请求,但PHP似乎并不支持开箱即用的模式.这些是我知道要完成此任务的变通方法.

我们目前使用Gearman来处理异步任务.我可以将一些服务重写为Gearman任务,并使用它来对数据库和服务进行异步调用.然而,我们在使用Gearman消耗大量过程和记忆方面遇到了不好的经历;强制使用在某些情况下重启我们的生产服务器,因为它们没有响应.但是,我相信由于脚本中的一些错误我能够跟踪这个问题,并且相信我已经修复了它.但是我觉得如果我们使用Gearman作为处理异步任务的任务池/管理器,这种不稳定性和过多的资源消耗可能会再次出现问题.

或者,我正在看pthreads.它似乎是一个更好的选择,因为它不需要运行Gearman守护进程来工作,它完成了我想要的.甚至似乎还有一个像样的框架,amphp.我们决定配置一个启用了pthreads的测试服务器.但是,我们不知道的是pthreads需要更改我们的Apache配置,特别是从httpd(又名prefork)转到httpd.worker.不可否认,我不是一位经验丰富的Apache管理员,所以我甚至不确定进行此项更改的后果是什么.因此,现在我对使用它犹豫不决,至少在我有时间研究这个之前.

所以我的问题是,如果我想在PHP中执行异步请求,我是否应该坚持使用Gearman知道我可能遇到问题,或者我应该冒险使用pthreads,即使它似乎需要更改我的Apache配置我坦率地说,不知道它会如何影响我们的网站?或者,也许,我正在尝试做的事情还有另一种选择,我还不知道.

服务器配置:

> PHP 5.6.1
> Apache 2.4.12
>红帽企业版6.3
> MySQL 5.5.28
> 8GB RAM

解决方法:

首先,异步和并行并发之间存在着深刻的混淆.

异步执行意味着对各个任务的指令进行交织,使得任务相互之间并发运行.

并行执行意味着并行执行各个任务的指令,使得它们相对于时间同时运行.

您可以使用漂亮的图片here找到有关异步和并行并发的更完整说明.

Gearmans多处理模型允许并行执行,pthreads也是如此.

当你说PHP中不支持异步执行时,这是错误的.

这是错误的,因为异步执行不需要语言支持来实现.只是交错指令并不复杂,here是一个适用于我们需要关注的任何PHP版本的例子.

像这样的交错指令会产生大量代码,在非阻塞I / O的情况下实际上是值得的.在这种情况下,交错指令允许您通过在同步阻塞代码强制您等待时执行另一个任务的指令来消除等待.这减少了总执行时间.

PHP的现代版本确实有设备(生成器)来使这个更好,并且正如您已经知道的那样,存在许多框架以尽可能地抽象出难度.

现在,我们开始在Web服务器的前端使用pthread.在最新版本的pthreads中,强制禁用此功能.没有充分的理由,也没有好时机在Web应用程序的前端创建(真正的,内核)线程,它永远不会有意义.

有关该决定的更多细节,请阅读this.

因此,展望未来,您的预期用途是不可能的.

没有什么比说pthreads得到这个更让我高兴了,但我不认为这不是真的.我认为你专注于错误的优化.

如果数据库架构或服务器出现问题,请解决该问题.如果您需要向外部API发出多个请求,那么可以采用最简单的路由;异步非阻塞I / O.

在任何特定任务中以齿轮或线程的形式投掷线程只能保证做一件事;使它更复杂.

上一篇:php – 如何从Gearman获取预定作业列表?


下一篇:gearman问题和php cli