swoole http server模式下有一些问题
jckings2007 opened this issue · 4 comments
在这种情况下yaf的运行模式实际上是cli,跟正常的http请求差别还是很大的
1.输入数据的获取,swoole http server运行时,超全局变量$_POST,$_GET,$_COOKIE,$_REQUEST是没有值的,post等数据是存放在swoole_http_request::post,swoole_http_request:get,swoole_http_request:cookie中的,所以在disptach(yaf_request)之前要自己把这些变量赋值给$_POST,$_GET,$_COOKIE;
同时,rawContent也是获取不到的(通过file_get_content("php://input")获取到的原始body数据),需要通过swoole_http_request::rawContent()获取到,然后自行管理,使yaf的业务代码能够使用这部分数据
2.如果说第一个问题还是可以通过调整swoole http server的实现细节来达到目的话,那么业务代码无法控制header的输出,自定义response code,以及当业务代码是使用yaf_response::setBody()来设置输出的时,cli模式无法获取输出就显得比较棘手,诚然,我们可以使用这样的代码来获取到yaf的response对象
$yafResponse = $this->application->getDispatcher()->returnResponse(true)->dispatch($yafRequest);
但是在cli模式下,yafResponse对象是yaf_response_cli的实例而非yaf_response_http的实例,而在yaf_response_cli的实现中,没有yaf_response_http中的getHeader()等方法,无法通过yafResponse对象来获取到业务代码定义的header和response code ,response body等数据。
为了解决这个问题,我修改了yaf_response_cli的实现,将yaf_reponse_http的相关实现移植过来,使得swoole层能通过yafResponse对象来得到header,response code ,response body。目前是这样来解决的,不知道还有没有更好的办法,希望共同讨论下
这种情况下,只能修改源码或者让鸟哥修复一下
其实还有一种方法,做个nginx代理就可以解决
哦? 能说的详细一点吗? 我现在就是nginx反代到swoole,swoole来跑yaf
建议把代码拿出来看看