需求 当一个用户给多个好友发送邀请邮件时,当一个请求需要从很多个数据库中读取数据时,当一个页面需要大量计算又想快速响应时,我们都希望php能够做到异步执行, 即并发地发邮件,并行地从多个数据库取数据,并行的计算业务逻辑,从而能够快速的响应用户,
当一个用户给多个好友发送邀请邮件时,当一个请求需要从很多个数据库中读取数据时,当一个页面需要大量计算又想快速响应时,我们都希望php能够做到异步执行,
即并发地发邮件,并行地从多个数据库取数据,并行的计算业务逻辑,从而能够快速的响应用户,不必让用户苦等。
仔细想下群发邮件、并行的从数据库中取数据、并行计算业务逻辑这些需求又都有不同,所以这里php异步并行需要区别对待。
1、群发邮件。此类需求一般不需要等所有邮件都发送完毕才给用户返回,所以是一种需要处理但不用立刻返回的需求
2、并行取数据。此类需求和群发邮件不一样,用户需要这些数据都从存储中取到了才能返回,是一种IO密集型的需求
3、并行计算。此类需求又与前两者不一样,因为不止是并行取数据和等待结果,重要的是大量的并行计算,是一种CPU密集型需求
解决这个问题网上有很多的解决方案
2、将此类任务存储在数据库中,然后cron脚本定时从数据库中读取任务进行处理。
靠谱的方案是使用消息中间件,例如RabbitMQ、ZeroMQ等。即采用类似消息队列的机制将这类耗时的任务存储起来,排队一个个处理。使用这种方案可以做到较高的并发量,稳定性也有保证。
当一个请求需要从很多数据库中获取数据时,在php中一般的做法是一个一个串行的从数据库中读。从而大量的时间都耗费在网络IO上,使响应时间变长。如何才能并行的或者说并发的从数据库中读取数据呢?
如果你用的数据库是mysql,那么不妨试下mysqli 扩展的异步方法mysqli_poll和mysqli_reap_async_query。
下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
|
这里推荐一个现成的RPC框架 workerman-jsonrpc,非常好用,强烈推荐。
使用方法如下:
1 |
|
./bin/workermand start
1 |
|
1 |
|
访问http://ip:33737界面类似如下:
框架下载地址:
简单高效json协议版本
workerman-JsonRpc
多平台友好的thrift版本 workerman-Thrift