博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP异步编程: 基于 PHP 实(chao)现(xi) NODEJS web框架 KOA
阅读量:5746 次
发布时间:2019-06-18

本文共 6665 字,大约阅读时间需要 22 分钟。

PHP异步编程: 基于 PHP 实(chao)现(xi) NODEJS web框架

说明

偶然间在 GITHUB 上看到有赞官方仓库的 。由于此前用过 KOA ,对于 KOA 的洋葱模型叹为观止。不由得心血来潮的看完了整个文档,接着 CTRL+CCTRL+V 让代码跑了起来。 文档中是基于 swoole 扩展进行开发,而 swooleWINDOWS 并不友好,向来习惯在 WINDOWS 下开发的我一鼓作气,将 改写并兼容了此项目。

体验

是使用 PHPKoa 开发 HTTP SERVER 的一个简单示例!

安装

composer require naka1205/phpkoa复制代码

使用

Hello World

υse(function(Context $ctx) { $ctx->status = 200; $ctx->body = "

Hello World

";});$app->listen(3000);复制代码

Error

υse(new Error());$app->υse(new NotFound());$app->υse(new Timeout(3)); //设置3秒超时$router = new Router();//正常访问$router->get('/hello', function(Context $ctx, $next) { $ctx->status = 200; $ctx->body = "

Hello World

";});//访问超时$router->get('/timeout', function(Context $ctx, $next) { yield async_sleep(5);});//访问出错$router->get('/error', function(Context $ctx, $next) { $ctx->thrοw(500, "Internal Error"); yield;});$app->υse($router->routes());$app->listen(3000);复制代码

Router

υse(new Error());$app->υse(new Timeout(5));$router = new Router();$router->get('/demo1', function(Context $ctx, $next) { $ctx->body = "demo1";});$router->get('/demo2', function(Context $ctx, $next) { $ctx->body = "demo2";});$router->get('/demo3/(\d+)', function(Context $ctx, $next, $vars) { $ctx->status = 200; $ctx->body = "demo3={$vars[0]}";});$router->get('/demo4', function(Context $ctx, $next) { $ctx->redirect("/demo2");});//RESTful API$router->post('/demo3/(\d+)', function(Context $ctx, $next, $vars) { //设置 session $ctx->setSession('demo3',$vars[0]); //设置 cookie $ctx->setCookie('demo3',$vars[0]); $ctx->status = 200; $ctx->body = "post:demo3={$vars[0]}";});$router->put('/demo3/(\d+)', function(Context $ctx, $next, $vars) { //获取单个 cookie $cookie_demo3 = $ctx->getCookie('demo3'); //或者 $cookies = $ctx->cookies['demo3']; //获取单个 session $session_demo3 = $ctx->getSession('demo3'); //或者 $session = $ctx->session['demo3']; $ctx->status = 200; $ctx->body = "put:demo3={$vars[0]}";});$router->delete('/demo3/(\d+)', function(Context $ctx, $next, $vars) { //清除所有 cookie $ctx->clearCookie(); //清除所有 session $ctx->clearSession(); $ctx->status = 200; $ctx->body = "delete:demo3={$vars[0]}";});//文件上传$router->post('/files/(\d+)', function(Context $ctx, $next, $vars) { $upload_path = __DIR__ . DS . "uploads" . DS; if ( !is_dir($upload_path) ) { mkdir ($upload_path , 0777, true); } $files = []; foreach ( $ctx->request->files as $key => $value) { if ( !$value['file_name'] || !$value['file_data'] ) { continue; } $file_path = $upload_path . $value['file_name']; file_put_contents($file_path, $value['file_data']); $value['file_path'] = $file_path; $files[] = $value; } $ctx->status = 200; $ctx->body = json_encode($files);});$app->υse($router->routes());$app->listen(3000);复制代码
mount('/curl', function() use ($router) { $client = new Client(); $router->get('/get', function( Context $ctx, $next ) use ($client) { $r = (yield $client->request('GET', 'http://127.0.0.1:3000/demo3/1')); $ctx->status = $r->getStatusCode(); $ctx->body = $r->getBody(); }); $router->get('/post', function(Context $ctx, $next ) use ($client){ $r = (yield $client->request('POST', 'http://127.0.0.1:3000/demo3/2')); $ctx->status = $r->getStatusCode(); $ctx->body = $r->getBody(); }); $router->get('/put', function( Context $ctx, $next ) use ($client){ $r = (yield $client->request('PUT', 'http://127.0.0.1:3000/demo3/3')); $ctx->status = $r->getStatusCode(); $ctx->body = $r->getBody(); }); $router->get('/delete', function( Context $ctx, $next ) use ($client){ $r = (yield $client->request('DELETE', 'http://127.0.0.1:3000/demo3/4')); $ctx->status = $r->getStatusCode(); $ctx->body = $r->getBody(); });});//http://127.0.0.1:5000/files$router->get('/files', function(Context $ctx, $next ) { $client = new Client(); $r = ( yield $client->request('POST', 'http://127.0.0.1:3000/files/2', [ 'multipart' => [ [ 'name' => 'file_name', 'contents' => fopen( __DIR__ . '/file.txt', 'r') ], [ 'name' => 'other_file', 'contents' => 'hello', 'filename' => 'filename.txt', 'headers' => [ 'X-Foo' => 'this is an extra header to include' ] ] ] ])); $ctx->status = $r->getStatusCode(); $ctx->body = $r->getBody();});// $router->get('/curl/(\w+)', function(Context $ctx, $next, $vars) {
// $method = strtoupper($vars[0]);// $client = new Client();// $r = (yield $client->request($method, 'http://127.0.0.1:3000/demo3/123'));// $ctx->status = $r->getStatusCode();// $ctx->body = $r->getBody();// });$app->υse($router->routes());$app->listen(5000);复制代码

Template

    

{title}

{time}

复制代码
υse(new Error());$app->υse(new Timeout(5));$router = new Router();$router->get('/hello', function(Context $ctx) { $ctx->status = 200; $ctx->state["title"] = "HELLO WORLD"; $ctx->state["time"] = date("Y-m-d H:i:s", time());; yield $ctx->render(__DIR__ . "/hello.html");});$app->υse($router->routes());$app->listen(3000);复制代码
    

{title}

Name Age
{name} {age}
复制代码
get('/info', function(Context $ctx) { $info = array("name" => "小明", "age" => 15); $ctx->status = 200; $ctx->state["title"] = "这是一个学生信息"; $ctx->state["info"] = $info; yield $ctx->render(__DIR__ . "/info.html");});复制代码
    

{title}

Name Age
{name} {age}
复制代码
get('/table', function(Context $ctx) { $table = array( array("name" => "小明", "age" => 15), array("name" => "小花", "age" => 13), array("name" => "小刚", "age" => 17) ); $ctx->status = 200; $ctx->state["title"] = "这是一个学生名单"; $ctx->state["table"] = $table; yield $ctx->render(__DIR__ . "/table.html");});复制代码

中间件

静态文件处理 中间件

    
PHPkoa Static
复制代码
υse(new Error());$app->υse(new Timeout(5));$app->υse(new NotFound()); $app->υse(new StaticFiles(__DIR__ . DS . "static" )); $router = new Router();$router->get('/index', function(Context $ctx, $next) { $ctx->status = 200; yield $ctx->render(__DIR__ . "/index.html");});$app->υse($router->routes());$app->listen(3000);复制代码

转载地址:http://opozx.baihongyu.com/

你可能感兴趣的文章
关于批处理-1
查看>>
Tomcat部署Web应用方法总结
查看>>
Python3 django2.0 字段加密 解密 AES
查看>>
CCNA实验之:网络地址转换(NAT)实验
查看>>
计算机网络原理笔记-停止等待协议
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
sql语句返回主键SCOPE_IDENTITY()
查看>>
机器学习开源项目精选TOP30
查看>>
/etc/resolv.conf文件详解
查看>>
【转】VC的MFC中重绘函数的使用总结(整理)
查看>>
JQuery日记_5.13 Sizzle选择器(六)选择器的效率
查看>>
oracle查看经常使用的系统信息
查看>>
Django_4_视图
查看>>
Linux的netstat命令使用
查看>>
lvm讲解,磁盘故障小案例
查看>>
大快网站:如何选择正确的hadoop版本
查看>>
经过这5大阶段,你离Java程序员就不远了!
查看>>
IntelliJ IDEA 连接数据库详细过程
查看>>
thymeleaf 学习笔记-基础篇
查看>>
PHP-X开发扩展
查看>>