MixVega CLI HTTP 网络框架开源项目

我要开发同款
匿名用户2021年06月29日
42阅读
开发技术PHP
所属分类Web应用开发、Web框架
授权协议Apache

作品详情

Vega是一个用PHP编写的CLI模式HTTP网络框架,支持Swoole、WorkerMan、FPM、CLI-Server

概述Vega是 MixPHP V3+ 内置的最核心的组件(可独立使用),参考golang gin mux 开发,它包含Web应用处理的大量功能(数据库处理除外),包括:路由、渲染、参数获取、中间件、文件上传、静态文件处理等;具有CLI模式下强大的兼容性,同时支持Swoole、WorkerMan、FPM、CLI-Server,并且支持Swoole的多种进程模型与协程。

推荐搭配以下数据库使用:

https://github.com/mix-php/databasehttps://github.com/mix-php/redishttps://github.com/top-think/think-ormhttps://github.com/illuminate/database推荐文章:

使用mix/vega+mix/db进行现代化的原生PHP开发技术交流知乎:https://www.zhihu.com/people/onanying官方QQ群:284806582 , 825122875 敲门暗号:vega

安装

需先安装 Swoole 或者 WorkerMan

composerrequiremix/vega快速开始Swoole多进程(异步)中使用<?phprequire__DIR__.'/vendor/autoload.php';$vega=newMix\Vega\Engine();$vega->handle('/hello',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');$http=newSwoole\Http\Server('0.0.0.0',9501);$http->on('Request',$vega->handler());$http->set(['worker_num'=>4,]);$http->start();开启多进程协程

$http->on('Request',$vega->handler());$http->on('WorkerStart',function($server,$workerId){//协程初始化//比如:启动mix/databasemix/redis的连接池});$http->set(['enable_coroutine'=>true,'worker_num'=>4,]);phpswoole.phpSwoole单进程(协程)中使用<?phprequire__DIR__.'/vendor/autoload.php';Swoole\Coroutine\run(function(){$vega=newMix\Vega\Engine();$vega->handle('/hello',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');$server=newSwoole\Coroutine\Http\Server('0.0.0.0',9502,false);$server->handle('/',$vega->handler());$server->start();});phpswooleco.phpWorkerMan中使用<?phprequire__DIR__.'/vendor/autoload.php';$vega=newMix\Vega\Engine();$vega->handle('/hello',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');$http_worker=newWorkerman\Worker("https://0.0.0.0:2345");$http_worker->onMessage=$vega->handler();$http_worker->count=4;Workerman\Worker::runAll();phpwokerman.phpstartPHP-FPM中使用在 nginx 配置 rewrite 重写到 index.php

<?phprequire__DIR__.'/vendor/autoload.php';$vega=newMix\Vega\Engine();$vega->handle('/hello',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');return$vega->run();PHP cli-server 中使用这个内置的Web服务器主要用于本地开发使用,不可用于线上产品环境。

<?phprequire__DIR__.'/vendor/autoload.php';$vega=newMix\Vega\Engine();$vega->handle('/hello',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');return$vega->run();php-Slocalhost:8000router.php访问测试%curlhttps://127.0.0.1:9501/hellohello,world!路由配置配置 Closure 闭包路由

$vega=newMix\Vega\Engine();$vega->handle('/hello',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');配置 callable 路由

classHello{publicfunctionindex(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');}}$vega=newMix\Vega\Engine();$vega->handle('/hello',[newHello(),'index'])->methods('GET');配置路由变量

$vega=newMix\Vega\Engine();$vega->handle('/users/{id:\d+}',function(Mix\Vega\Context$ctx){$id=$ctx->param('id');$ctx->string(200,'hello,world!');})->methods('GET');配置多个 method

$vega=newMix\Vega\Engine();$vega->handle('/hello',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET','POST');路由前缀(分组)$vega=newMix\Vega\Engine();$sub=$vega->pathPrefix('/foo');$sub->handle('/bar1',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');$sub->handle('/bar2',function(Mix\Vega\Context$ctx){$ctx->string(200,'hello1,world!');})->methods('GET');参数获取请求参数方法名称描述$ctx->request:ServerRequestInterface符合PSR的请求对象$ctx->response:ResponseInterface符合PSR的响应对象ctx−>param(stringctx−>param(stringkey):string获取路由参数ctx−>query(stringctx−>query(stringkey):string获取url参数,包含路由参数ctx−>defaultQuery(stringctx−>defaultQuery(stringkey,string$default):string获取url参数,可配置默认值ctx−>getQuery(stringctx−>getQuery(stringkey):stringornull获取url参数,可判断是否存在ctx−>postForm(stringctx−>postForm(stringkey):string获取post参数ctx−>defaultPostForm(stringctx−>defaultPostForm(stringkey,string$default):string获取post参数,可配置默认值ctx−>getPostForm(stringctx−>getPostForm(stringkey):stringornull获取post参数,可判断是否存在Headers,Cookies,Uri...方法名称描述$ctx->contentType():string请求类型ctx−>header(stringctx−>header(stringkey):string请求头ctx−>cookie(stringctx−>cookie(stringname):stringcookies$ctx->uri():UriInterface完整uri$ctx->rawData():string原始包数据客户端IP方法名称描述$ctx->clientIP():string从反向代理获取用户真实IP$ctx->remoteIP():string获取远程IP上传文件处理方法名称描述ctx−>formFile(stringctx−>formFile(stringname):UploadedFileInterface获取上传的第一个文件$ctx->multipartForm():UploadedFileInterface[]获取上传的全部文件文件保存

$file=$ctx->formFile('img');$targetPath='/data/project/public/uploads/'.$file->getClientFilename();$file->moveTo($targetPath);请求上下文请求当中需要保存一些信息,比如:会话、JWT载荷等。

方法名称描述ctx−>set(stringctx−>set(stringkey,$value):void设置值ctx−>get(stringctx−>get(stringkey):mixedornull获取值ctx−>mustGet(stringctx−>mustGet(stringkey):mixedorthrows获取值或抛出异常中断执行abort 执行后,会停止执行后面的全部代码,包括中间件。

方法名称描述$ctx->abort():void中断,需自行处理响应ctx−>abortWithStatus(intctx−>abortWithStatus(intcode):void中断并响应状态码ctx−>abortWithStatusJSON(intctx−>abortWithStatusJSON(intcode,$data):void中断并响应JSON$vega=newMix\Vega\Engine();$vega->handle('/users/{id}',function(Mix\Vega\Context$ctx){if(true){$ctx->string(401,'Unauthorized');$ctx->abort();}$ctx->string(200,'hello,world!');})->methods('GET');响应处理方法名称描述ctx−>status(intctx−>status(intcode):void设置状态码ctx−>setHeader(stringctx−>setHeader(stringkey,string$value):void设置headerctx−>setCookie(stringctx−>setCookie(stringname,string value,intvalue,intexpire=0,...):void设置cookiectx−>redirect(stringctx−>redirect(stringlocation,int$code=302):void重定向JSON请求与输出获取JSON请求数据

$vega=newMix\Vega\Engine();$vega->handle('/users',function(Mix\Vega\Context$ctx){$obj=$ctx->getJSON();if(!$obj){thrownew\Exception('Parametererror');}var_dump($obj);$ctx->JSON(200,['code'=>0,'message'=>'ok']);})->methods('POST');mustGetJSON 自带有效性检查,以下代码等同于上面

$vega=newMix\Vega\Engine();$vega->handle('/users',function(Mix\Vega\Context$ctx){$obj=$ctx->mustGetJSON();var_dump($obj);$ctx->JSON(200,['code'=>0,'message'=>'ok']);})->methods('POST');JSONP处理$vega=newMix\Vega\Engine();$vega->handle('/jsonp',function(Mix\Vega\Context$ctx){$ctx->JSONP(200,['code'=>0,'message'=>'ok']);})->methods('GET');HTML视图渲染创建视图文件 foo.php

<p>id:<?=$id?>,name:<?=$name?></p><p>friends:</p><ul><?phpforeach($friendsas$name):?><li><?=$name?></li><?phpendforeach;?></ul>配置视图路径,并响应html

$vega=newMix\Vega\Engine();$vega->withHTMLRoot('/data/project/views');$vega->handle('/html',function(Mix\Vega\Context$ctx){$ctx->HTML(200,'foo',['id'=>1000,'name'=>'小明','friends'=>['小花','小红']]);})->methods('GET');静态文件处理基于 sendfile 零拷贝,不支持在 PHP-FPM 中使用

$vega=newMix\Vega\Engine();$vega->static('/static','/data/project/public/static');$vega->staticFile('/favicon.ico','/data/project/public/favicon.ico');设置中间件给某个路由配置中间件,可配置多个

$vega=newMix\Vega\Engine();$func=function(Mix\Vega\Context$ctx){//dosomething$ctx->next();};$vega->handle('/hello',$func,function(Mix\Vega\Context$ctx){$ctx->string(200,'hello,world!');})->methods('GET');配置全局中间件,即便没有匹配到路由也会执行

$vega=newMix\Vega\Engine();$vega->use(function(Mix\Vega\Context$ctx){$ctx->next();});前置中间件

$vega->use(function(Mix\Vega\Context$ctx){//dosomething$ctx->next();});后置中间件

$vega->use(function(Mix\Vega\Context$ctx){$ctx->next();//dosomething});404自定义$vega=newMix\Vega\Engine();$vega->use(function(Mix\Vega\Context$ctx){try{$ctx->next();}catch(Mix\Vega\Exception\NotFoundException$ex){$ctx->string(404,'New404response');$ctx->abort();}});500全局异常捕获$vega=newMix\Vega\Engine();$vega->use(function(Mix\Vega\Context$ctx){try{$ctx->next();}catch(\Throwable$ex){if($exinstanceofMix\Vega\Abort||$exinstanceofMix\Vega\Exception\NotFoundException){throw$ex;}$ctx->string(500,'New500response');$ctx->abort();}});LicenseApacheLicenseVersion2.0, https://www.apache.org/licenses/

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论