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

【推荐收藏】swoft最佳实践

时间:2023-03-29 20:11:13 PHP

这是使用swoft两个月后的总结文章!,会陆续更新。这是web-api开发的总结。如果您使用websocket和其他服务,它可能不适用。本章将解释一些规范、习惯或优化。一、安装&环境swoole安装swoft开发环境最好使用mac(以下截图均为mac环境)。下面的安装代码需要开启openssl扩展。如果不需要,可以直接peclinstallswoole,一路回车。$brewinfoopenssl------------------为了让编译器找到openssl,你可能需要设置:exportLDFLAGS="-L/usr/local/opt/openssl/lib"exportCPPFLAGS="-I/usr/local/opt/openssl/include”*****copy/usr/local/opt/openssl$peclinstallswoole*****enableopensslsupport?[no]:yes--with-openssl-dir=/usr/local/opt/openssl新手必须扩展sdebug,兼容swoole的xdebug分支(https://github.com/mabu233/sdebug)swoft因为文档不够详细,有时候你还得看源码,跟踪运行,断点调试必不可少Composerextendsswoft/devtool(用于数据库迁移,实体生成)ctfang/swoft-admin(devtool没有接口overlibrary,开发接口操作,日记查看,在线代码查看,路由生成,控制器生成等)swoft安装没什么特别的,跳过composercreate-projectswoft/swoftswoft2.配置修改,常用environment.env配置添加HTTP_PORThttp服务端口DB_DSN数据库dnsDB_USERNAME数据库用户名DB_PASSWORD数据库用户密码.env文件没有提交给git,所以不会有冲突,团队里的每个人都加一份,.env所有键值对都应存在于.env.example中,并带有默认值和注释以使用.env中的配置,在app/bean.php文件中使用'port'=>env("HTTP_PORT",18306),,当然env()函数不局限于配置文件,一般用于业务扩展的配置。3.重要的目录划分app/Common是项目内部的,public和public。定义一个接口返回格式class0,'msg'=>"ok",'data'=>null];}publicstaticfunctionsuccess($data=[]):array{return['code'=>0,'msg'=>'ok','data'=>$data];}publicstaticfunctioncode(array$msg){return['code'=>$msg[0],'msg'=>$msg[1],'data'=>null];}publicstaticfunctionerror($msg='error',$code=self::EROR,$data=[]){return['code'=>$code,'msg'=>$msg,'data'=>$数据];}}定义一个状态码类time()])App/Model/Dao项目内部数据库操作类。比如用户可以通过操作curd设置一个UserDaoapp/Model/Data跨模块数据定义,有点像数据缓存层,但是Data并没有用来有效缓存多个请求。比如session对于redis是不适用的,但是从redis抓取的session数据转换成SessionData后,可以放在Data目录下,因为SessionData对象对当前请求是有效的。App/Model/Service外部项目与内部项目的对接层,也可以有一小部分业务处理;例如:定义一个ApplePaymentAppStoreService,然后它连接到ApplePayment服务。定义一个支付服务PayService,由用户配置初始化支付库(目前推荐yurunsoft/pay-sdk,这个库不是psr编码规范,有强迫症会犯)app/Model/Entitydatabaseentity,由Devtool生成,无需手动修改app/Model/Logic逻辑层。范围很广。当上面的Model不好分层的时候,放在这里就行了。所有代码都是符合逻辑的...4.中间件swoft不支持路由分组,所以只能判断路由,进入,定义一个登录权限检查,因为有几个一两个接口不需要检查,只能声明一个全局中间件,然后在中间判断是否是公共路由,跳过//开放给公共接口$path=$request->getUri()->getPath();如果(in_array($path,self::$publicAction)){$response=$handler->handle($request);return$response;}给request赋值就像使用uid一样,因为所有的接口都可以用,需要在中间件中检出,直接赋值给request对象即可$request->uid=$token->流体;如果是某个请求使用的值,可以使用psr规范的withAttribute$request=$request->withAttribute('test','thisisthevalue')。如果你是新项目,可以使用ctfang/swoft-admin创建controller,在创建controller的时候选择开启5.调试断点调试如果安装了sdebug扩展,需要停止php-fpm服务。默认端口冲突,否则无法使用。添加phpStorm断点启动,在代码中添加断点,鼠标点击代码左侧行数旁边,即可添加启动断点,点击小bug图标请求到达断点,就会automaticallystop,wait你可以点击下一步继续运行Sql调试。修改app/Listener/RanListener.php,取消output()->info($rawSql);的注释,所有sql都会打印到controller。如果有在线测试环境,可以添加Log::debug($rawSql);将sql写入单独的文件,然后使用ctfang/swoft-admin在线查看日志。注意使用ctfang/swoft-admin时一定要设置内网访问权限,因为它的权限非常大,可以直接查看代码和执行命令。6.内存优化因为常驻内存,所有内存都是敏感的。不像fpm,请求结束后直接回收。常驻内存后,即使是临时对象,PHP也会等到缓冲区满了才去清理垃圾,这样可以节省一点点。所有的数据对象化,比如导出excel文档等,最好定义一个类文件进行赋值:uidusername1张三可以定义一个类classUserExcelData{public$uid;public$username;}赋值可以节省keys的消耗,Object赋值只是一个简单的属性地址赋值,省略了key本身的字符串。当数据很大时,节省的内存是非常可观的。与数组赋值相比,可以节省几十倍。更多学习内容,可访问【与各大厂商对比】优质PHP架构师教程目录。只要能读懂,就能保证你的薪水更上一层楼(持续更新中)。以上内容希望对大家有所帮助。很多PHPer总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道从哪里开始改进,我整理了一些这方面的资料,包括但不限于:分布式架构,高可扩展性、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等知识点免费分享给你如果你需要高级干货。有需要的可以点击领取高级PHP月薪30k>>>架构师成长之路【免费获取视频和面试资料】