这是一篇使用 swoft 两个月后的总结文章!,后续会陆续更新的
这是 web-api 开发的总结,如果使用 websocket 等服务的可能不适用,本章节会对一些规范、习惯,或者优化进行一些说明
一、安装 & 环境
swoole 安装
swoft 开发的环境最好是 mac(以下截图都是以 mac 环境下的)
以下安装代码是需要开启 openssl 扩展的,如果不需要可以直接 pecl install swoole 一路回车即可
$ brew info openssl -------------------- For compilers to find openssl you may need to set: export LDFLAGS="-L/usr/local/opt/openssl/lib" export CPPFLAGS="-I/usr/local/opt/openssl/include” * * * * * 复制 /usr/local/opt/openssl $ pecl install swoole * * * * * enable openssl support? [no] : yes --with-openssl-dir=/usr/local/opt/openssl
新手必备扩展
sdebug,兼容 swoole 的 xdebug 分支(https://github.com/mabu233/sdebug)
swoft 因为文档不够详细,有时候必须看源码,跟踪运行,断点调试必不可少
composer 扩展
Swoft 安装无特别,跳过
composer create-project swoft/swoft swoft
二、配置修改,常用环境.env 配置新增
.env 文件是不提交到 git
的,所以不会产生冲突,团队每个人都新增一份,.env
所有键值对都应该在.env.example
存在一份默认值和注释说明。
使用 .env 里的配置,在 app/bean.PHP
文件下使用 'port' => env("HTTP_PORT",18306),
,当然 env()
函数是不限制在配置文件用的,只是一般为了业务扩展,习惯在配置使用而已。
三、重要目录划分
app/Common
对项目内部,公用的、公开的。
定义一个接口返回格式类
<?PHP namespace App\Common; class Message { const EROR = 100; public static function ok():array { return ['code' => 0,'msg' => "ok",'data' => null]; } function success($data = []):$datafunction code(array $msg) { return ['code' => $msg[0],'msg' => $msg[1],1)">function error($msg = 'error',$code = self::EROR,1)">$data = []) { $code,1)">$msg,1)">]; } }
定义一个状态码类
这样,所有接口都可以使用 Message::code(Code::NotUsers)
、Message::success(['time'=>time()])
app/Model/Dao
app/Model/Data
跨模块数据定义,有一点像数据缓存层,但是 Data
不是用于放跨多起请求有效的缓存,例如 session
for redis
就不适用了,但是从 redis
取出来的 session
数据后,转化成 SessionData
就可以放到 Data
目录,因为 SessionData
对象是当前请求有效的。
app/Model/Service
外部项目和内部项目的对接层,也可以有小部分业务处理;例如:
定义一个苹果支付 AppStoreService
,那么它和苹果支付服务对接的。
定义一个支付服务 PayService
,它是用户初始化支付库的配置的(目前推荐 yurunsoft/pay-sdk
,吐槽下这个库不是 psr 编码规范,强迫症要犯了)
app/Model/Entity
app/Model/Logic
逻辑层,范围很广,上面 Model 不好分层的时候,就放到这里好了,所有代码都是有逻辑的……
四、中间件
// 对外公开的接口 $path = $request->getUri()->getPath(); if (in_array($path,self::$publicAction)) { $response = $handler->handle($request); return $response; }
往请求赋值
像用 uid 等,因为所有接口都可以使用的,就是需要在中间件可以检查出来,可以直接赋值到请求对象
$request->uid = $token->uid;
如果某个请求使用的值,可以使用 psr 规范的 withAttribute
$request = $request->withAttribute('test','这是值')
如果你是新项目,可以使用 ctfang/swoft-admin
创建控制器,在创建控制器时候选择启用的中间件,这样就不会漏
五、调试
断点调试
如果有安装 sdebug
扩展,需要停止 PHP-fpm
服务,默认端口冲突,不然不能使用。
新增 PHPStorm 断点启动,
启动断点,点击小虫子图标
请求来到断点时候,就会自动停止,等待你点击下一步才可以继续运行
sql 调试
注意使用 ctfang/swoft-admin
,一定设置内网访问,因为它权限非常大,可以直接查看代码和执行命令等。
六、内存优化
- 所有数据对象化
- 例如像导出 excel 文档等,最好也是定义一个类文件进行赋值:
uid | username |
---|---|
1 | 张三 |
可以定义一个类
UserExcelData { public $uid; $username; }
赋值就可以节省 key 带来的消耗,对象赋值只是简单的属性地址赋值,key 本身字符串是省去的。
数据大时候,节省的内存非常可观,对比数组赋值,几十倍都有可能。