1

文章目录

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方法的参数
image.png

2.再php think swoole start即可。

为什么说php think swoole start呢?其实是在源码目录下配置了两个命令而已。如下图所示
image.png

3.请求时会遇过即使多次不同url请求,还是会走都到第一次请求url的方法中的问题。
比如第一次的url是localhost:8080/api/task/demo,第二次的url是localhost:8080/api/task/test。浏览器访问时还是会走到task控制器的demo方法。
第二次其中是因为tp底层这里,有判断,把下图标记的判断去掉即可。因为$this->path变量在第一次请求时次请求时赋予值。后面的话使用到第一次$this->path的值。为什么以前没有这个问题,结合swoole之后就会有这个问题呢?
我刚开始也很疑惑,阅读源码后发现
image.png
原来在onWorkerStart(在此回调方法加载的文件会常驻内存)方法中165行,执行应用实例化时,其实中加载了很多类文件。其中就包括Request类,$this->path是Request类的属性。到此破案~。
image.png

4.发现访问路由定义好的url时,每次都走到index模块index控制器的index方法的问题。
tp底层按照原来的写法,会走到第二种判断,然后$_SERVER中没有argv这个参数,会把pathinfo赋值为空。会默认走到 index模块的index控制器的index方法。
image.png
应该修改为下面的方式,将isCli放在后面去判断,即可解析对应的路径
image.png

或者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.

image.png

image.png

3.注意事项。

think-swoole为我们做了一个修改代码后,自动重启的功能。但有时候发现,修改后也没有自动重启。经过阅读源码后,在下图中加上这样的一段即可
// 如果开启了APC或OPcache,还需要刷新缓存后,平滑重启才会生效。

    if (extension_loaded('apc')) {
        apc_clear_cache();
    }
    if (extension_loaded('Zend OPcache')) {
        opcache_reset();
    }

image.png
此问题发现后我也是通过github反馈给thinkphp官方修复了。如果还是遇到没有自动重启的问题,可以尝试添加上面的那段代码。
image.png

本文为夜雨闻铃原创文章,转载无需和我联系,但必须注明文章出处!!!
文章出处:夜雨闻铃的思否文章(https://segmentfault.com/a/11...)


夜雨闻铃
50 声望12 粉丝

分享和记录自己成长之路遇到学习到的经验和遇到的坑(偏php和go)。为了更好更活跃的社区,尽一份自己的微薄之力。