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

使用mix-vega+mix-db进行现代原生PHP开发

时间:2023-03-30 03:12:37 PHP

这几年一直在javascript和golang生态中徘徊,发现npm和gomod的很多优点。最近回去开发MixPHPV3,发现composer一直是一个很好的工具,但是很多phper对composer的使用不是很深入。今天我将使用composer搭建一个原生项目,帮助大家了解现代原生PHP开发流程。PHP开发者可能是所有语言中最被宠坏的,因为几乎每个框架都提供了脚手架,像这样:composercreate-project在npm和gomod中没有这个功能,需要自己创建程序的骨架,当然,npm和go生态系统都产生了自己的解决方案,由vue-cli和mixcli等脚手架工具负责创建。创建项目与npminit和gomodinit一样,我们使用composerinit创建项目mkdirhellocdhellocomposerinit交互填写一些内容,生成composer.json文件{"name":"liujian/hello","type":"project","autoload":{"psr-4":{"liujian\\Hello\\":"src/"}},"require":{}}这个文件是根据composerlibrarystandard,必须有两级名称,这让我很痛苦,所以我修改了{"name":"project/app","type":"project","autoload":{"psr-4":{"App\\":"src/"}},"require":{}}选择我需要使用的库和node.js一样走生态,第二步找到我们需要的库,通常我们的需求是写一个API服务,需要一个httpserver库和一个db库才能开始工作。因为是现代PHP开发,所以选择了PHPCLI方式的常驻高性能库。这里我选择:mix/vegaVega是一个用PHP编写的CLI模式HTTP网络框架,支持Swoole、WorkerManmix/database。适用于各种环境的轻量级数据库,支持FPM、Swoole、WorkerMan,可选连接池(协程),这两者都是MixPHPV3+的核心组件。MixVega&MixDatabase安装Vega同时支持Swoole和WorkerMan,未来会支持Swow。最简单的原理就是WorkerMan可以在不安装扩展的情况下执行。开发先用WorkerMan驱动Vega,上线时可以根据自己的需要切换。安装Workermancomposerrequireworkerman/workermaninstallMixVegacomposerrequiremix/vegainstallMixDatabasecomposerrequiremix/database创建入口文件vue的入口一般是src/main.js因为js一般都是单入口项目,所以我们还是按照二进制约定创建一个bin/start.php入口文件handleF('/hello',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');$http_worker=newWorkerman\Worker("http://0.0.0.0:2345");$http_worker->onMessage=$vega->handler();$http_worker->count=4;Workerman\Worker::runAll();然后我们模仿npm的方式,在composer.json中添加:"scripts":{"server":"phpbin/start.phpstart"},这里我很迷惑composer是怎么工作的,npm的入口文件是这样的不需要require__DIR__。'/../供应商/自动加载。PHP';npmrunserver直接执行的脚本可以找到对应的依赖,但是即使composer使用composerrunserver执行对应的脚本,代码中还是需要处理autoload,给差评。现在让我们尝试composerrunserver来启动服务:%composerrunserver>php8bin/start.phpstartWorkerman[bin/start.php]startinDEBUGmode---------------------------------------工人-------------------------------------Workerman版本:4.0.19PHP版本:8.0.7-----------------------------工人--------------------------protouserworkerlistenprocessesstatustcpliujiannonehttp://0.0.0.0:23454[OK]------------------------------------------------------------------------------------------按Ctrl+C停止。开始成功。写一个API接口我们就修改上面的入口文件,写一个用户查询接口,Vega的使用非常简单。handleF('/users/{id}',function(Mix\Vega\Context$ctx)使用($db){$row=$db->table('users')->where('id=?',$ctx->param('id'))->first();if(!$row){thrownew\Exception('找不到用户');}$ctx->JSON(200,['code'=>0,'message'=>'ok','data'=>$row]);})->methods('GET');$http_worker=newWorkerman\Worker("http://0.0.0.0:2345");$http_worker->onMessage=$vega->handler();$http_worker->count=4;Workerman\Worker::runAll();curl测试一下:%curlhttp://127.0.0.1:2345/users/1{"code":0,"message":“确定”,“数据”:{“id”:“1”,“名称”:“foo2”,“余额”:“102”,“add_time”:“2021-07-0608:40:20”}}使用PSR调整一下目录结构前面我们确定了PSR"autoload":{"psr-4":{"App\\":"src/"}},接下来我们利用自动加载的方式,对上述入口文件的代码进行合理拆分。拆分后的目录结构如下:├──bin│└──start.php├──composer.json├──composer.lock├──src│├──Controller││└──Users.php│├──数据库││└──DB.php│└──路由器│└──Vega.php└──vendorbin/start.phponMessage=$vega->handler();$http_worker->count=8;Workerman\Worker::runAll();src/Router/Vega.phphandleC('/users/{id}',[newUsers(),'index'])->methods('GET');返回$维加;}}src/Controller/Users.phptable('users')->where('id=?',$ctx->param('id'))->首先();if(!$row){thrownew\Exception('找不到用户');}$ctx->JSON(200,['code'=>0,'message'=>'ok','data'=>$row]);}}src/Database/DB.php