文章目录

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...)