当前位置: 首页 > 后端技术 > PHP

swoole结合thinkphp使用详解

时间:2023-03-29 17:48:06 PHP

文章目录1.thinkphp为什么要结合swoole?2.如何结合swoole?三、注意事项1、thinkphp为什么要和swoole结合使用?首先我们要明白thinkphp和swoole结合的意义是什么?传统的fpm框架每次请求都要重新加载大量的文件,而且每次加载的文件几乎都是一样的,在这方面浪费了很多效率,也拖慢了界面的响应速度。如果我们可以加载一次文件,那么以后就不需要再加载了,那就太好了,运行效率也会高很多。这时候就可以通过引入swoole来完成,swoole可以让加载的文件放到内存中。达到了加载一次,后面不加载,直接读内存的效果。这里我们使用swoole作为http服务器来分析2.thinkphp如何结合swoole?第二,我们具体怎么组合呢?这里我们使用thinkphp5.1和swoole4的组合。首先安装thinkphp5.1和swoole扩展。然后安装thinkphp-swoole(thinkphp官方写的thinkphp结合swoole的一个包)composerrequiretopthink/think-swoole=2.0.*这个包的具体用法可以去thinkphp手册搜索具体的swoole的用法(https://www.kancloud.cn/manua...)除了手册中描述的问题,我也会分享我在实际过程中遇到的问题和解决方法,这些都没有手册。1.然后在config目录下新建一个swoole.php配置文件,里面可以配置swoole设置方法的很多参数2.然后phpthinkswoolestart。为什么说phpthinkswoolestart?其实在源码目录下配置了两条命令。如下图3.请求的时候,即使有多个不同的url请求,问题还是会转到第一次请求url的方法上。比如第一个url是localhost:8080/api/task/demo,第二个url是localhost:8080/api/task/test。浏览器访问的时候,还是会去taskcontroller的demo方法。第二次是因为tp底层有判断,去掉下图标注的判断即可。因为$this->path变量是在第一次被请求的时候被赋值的。下面的单词是第一次使用$this->path的值。为什么之前没有这个问题,但是结合swoole之后,就会出现这个问题?我一开始也很困惑。阅读源码后发现在onWorkerStart(该回调方法加载的文件会驻留在内存)方法的第165行,在实例化应用时,实际上加载了很多类文件。它包含了Request类,$this->path是Request类的一个属性。这里破案~。4、发现访问路由定义的url时,每次都会去index模块indexcontroller的index方法。按照原来的写法,tp底层会去进行二次判断,然后$_SERVER中没有argv参数,pathinfo赋值为空。默认会去index模块的indexcontroller的index方法。应该修改成下面的方法,isCli放在后面判断,可以解析对应的路径或者nginx没有配置pathinfo方式。导致解析的时候pathinfo一直为空,所以就到了默认的index路径,此时可以配置nginx的配置文件。#下面两句是fastcgi权限,可以支持?s=/module/controller/action的url访问方式fastcgi_split_path_info^((?U).+\.php)(/?.+)$;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;#下面两句可以真正支持index.php的pathinfo模式/index/index/index没有遇到手册上没有的坑。分享如何使用think-swoole作为webscoket服务器的例子,只需要在swoole.php配置文件中添加此配置即可。其实这个官方手册并没有告诉你可以这么用。但是看了源码后发现,通过这样的配置,可以搭建一个websockerServer。3、注意事项。think-swoole已经为我们做了修改代码后自动重启的功能。但是有时候发现修改后没有自动重启。看完源码,在下图中添加这么一段//如果开启了APC或者OPcache,需要刷新缓存,平滑重启才会生效。如果(extension_loaded('apc')){apc_clear_cache();}if(extension_loaded('ZendOPcache')){opcache_reset();发现这个问题后,我也通过github反馈给thinkphp官方修复了。如果还是遇到没有自动重启的问题,可以尝试添加上面的代码。本文为叶宇文玲原创文章,转载无需联系本人,但必须注明文章出处!!!文章来源:叶宇文玲的贴心文章(https://segmentfault.com/a/11...)