1
yaxin 2015-03-23 11:00:02 +08:00
消息队列,能解决你的问题
|
3
raincious 2015-03-23 11:08:11 +08:00 2
@kisshere
就是将昂贵的操作交给消息队列。 比如你可以不在这个PHP程序里处理那个longtime操作,直接输出好给用户,然后请求消息队列来进行处理。 不过PHP是可以在输出之后仍然继续运行的的,不过具体操作有点Hack。你需要忽略用户的关闭请求,用ignore_user_abort,然后在数据输出之后立即用flush和ob_flush之类来关闭输出缓存,让上层(Apache、Nginx之类)知道你结束响应了,之后你就可以Happy的继续玩你的了。 但是PHP不太适合执行长时间的任务,Apache的那个线程会被锁死直到释放,注意。 斗胆拿这段代码供你参考下: https://github.com/raincious/facula/blob/master/src/Facula/Base/Prototype/Core/Response.php#L506 注意ob已经在436行打开过了。 |
4
freefcw 2015-03-23 11:20:57 +08:00 1
优先还是考虑使用消息队列之类的在别的地方处理,主要原因#3说的比较清楚了。对于单线程的php来说,执行这种长时间的任务会影响你的并发,而且也不方便后期的拆解模块。
如果使用php-fpm的话,可以使用fastcgi_finish_request这个函数,在输出以后继续执行你的php代码,详见 http://php.net/manual/zh/function.fastcgi-finish-request.php |
5
simman 2015-03-23 11:21:49 +08:00
肯定要用队列了,主要是异步问题。
|
6
cute 2015-03-23 11:21:52 +08:00 1
php-fpm可以这样,还是建议使用服务端异步队列
fastcgi_finish_request(); longtime(); |