文章目录
1.为什么要让thinkphp结合swoole?
2.如何结合swoole?
3.注意事项
1.为什么要让thinkphp结合swoole?
首先,我们需要明白结合thinkphp和swoole的意义是什么?
传统的fpm框架,在每次请求时都要重新加载大量文件,而且每次加载的文件几乎都是相同的,在这方面浪费了不少效率,拉低了接口的响应速度。如果我们能做到加载一次文件,后面就不需要加载了,那就好了,运行效率就高很多了。
此时引入swoole即可做到,swoole可以让加载的文件,放到内存中。达到加载一次,后面无需加载,直接读内存的效果。这里我们把swoole作为一个http server来分析
2.thinkphp如何结合swoole?
其次我们要如何具体结合呢?
这里我们使用thinkphp5.1和swoole4结合。
首先安装好thinkphp5.1和swoole扩展。
然后在安装thinkphp-swoole(thinkphp官方写的一个thinkphp结合swoole的包)即可
composer require topthink/think-swoole=2.0.*
这个包的用法具体可以去thinkphp的手册上搜索swoole具体用法(https://www.kancloud.cn/manua...)
这里会讲除了手册中说明的问题,还会分享实际过程中,我在使用过程中遇到的问题与解决方式,这些手册上是没有的。
1.然后在config目录中新建一个swoole.php的配置文件,其中可以配置很多swoole的set方法的参数
2.再php think swoole start即可。
为什么说php think swoole start呢?其实是在源码目录下配置了两个命令而已。如下图所示
3.请求时会遇过即使多次不同url请求,还是会走都到第一次请求url的方法中的问题。
比如第一次的url是localhost:8080/api/task/demo,第二次的url是localhost:8080/api/task/test。浏览器访问时还是会走到task控制器的demo方法。
第二次其中是因为tp底层这里,有判断,把下图标记的判断去掉即可。因为$this->path变量在第一次请求时次请求时赋予值。后面的话使用到第一次$this->path的值。为什么以前没有这个问题,结合swoole之后就会有这个问题呢?
我刚开始也很疑惑,阅读源码后发现
原来在onWorkerStart(在此回调方法加载的文件会常驻内存)方法中165行,执行应用实例化时,其实中加载了很多类文件。其中就包括Request类,$this->path是Request类的属性。到此破案~。
4.发现访问路由定义好的url时,每次都走到index模块index控制器的index方法的问题。
tp底层按照原来的写法,会走到第二种判断,然后$_SERVER中没有argv这个参数,会把pathinfo赋值为空。会默认走到 index模块的index控制器的index方法。
应该修改为下面的方式,将isCli放在后面去判断,即可解析对应的路径
或者nginx没有配置pathinfo模式。导致pathinfo解析时一直为空,所以走到了默认的index路径,此时配置nginx的配置文件即可。
#下面两句是给fastcgi权限,可以支持 ?s=/module/controller/action的url访问模式
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#下面两句才能真正支持 index.php/index/index/index的pathinfo模式
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
后面就能正常运行了。也没遇到什么手册上没有的坑了。
分享如何让think-swoole作为一个webscoket服务端的例子,只需要在swoole.php的配置文件中添加这样配置。其实这个官方手册没有告诉你,可以这样用。但阅读源码后发现这样配置一下,就可以搭建一个websocker Server.
3.注意事项。
think-swoole为我们做了一个修改代码后,自动重启的功能。但有时候发现,修改后也没有自动重启。经过阅读源码后,在下图中加上这样的一段即可
// 如果开启了APC或OPcache,还需要刷新缓存后,平滑重启才会生效。
if (extension_loaded('apc')) {
apc_clear_cache();
}
if (extension_loaded('Zend OPcache')) {
opcache_reset();
}
此问题发现后我也是通过github反馈给thinkphp官方修复了。如果还是遇到没有自动重启的问题,可以尝试添加上面的那段代码。
本文为夜雨闻铃原创文章,转载无需和我联系,但必须注明文章出处!!!
文章出处:夜雨闻铃的思否文章(https://segmentfault.com/a/11...)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。