乐趣区

关于php:swoole结合thinkphp的使用详解

文章目录

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

退出移动版