Just for fun——基於Swoole作個小框架

原文連接php

swoole

使 PHP 開發人員能夠編寫高性能的異步併發 TCP、UDP、Unix Socket、HTTP,WebSocket 服務。Swoole 能夠普遍應用於互聯網、移動通訊、企業軟件、雲計算、網絡遊戲、物聯網(IOT)、車聯網、智能家居等領域。 使用 PHP + Swoole 做爲網絡通訊框架,能夠使企業 IT 研發團隊的效率大大提高,更加專一於開發創新產品。git

總之,這個庫讓PHP能夠常駐內存,並提供了http server,tcp server等功能。github

docker-compose.xml

利用docker,快速生成帶swoole擴展的PHP環境,salamanderphp-cli 這個鏡像,默認運行的是目錄下public目錄中server.php文件docker

version: '2'
services:
  php:
    image: salamandermh/salamanderphp-cli:1.0
    volumes:
      - ./src:/var/www
      - ./php/php.ini:/usr/local/etc/php/php.ini
    ports: 
      - 8888:8888
複製代碼

路由分發

由於swoole提供了http server的功能,因此swoole會告訴咱們當前$uri,$http_method這些量,所喲路由庫繼續能夠用來分發$uri,這裏選用了FastRoute,固然,別的庫確定也是能夠的。segmentfault

server.php

<?php
$http = new swoole_http_server("0.0.0.0", 8888);


// 定義常量
define("ROOT", getcwd() . '..');
define('APP', ROOT . '/app');

require ROOT . '/vendor/autoload.php';

$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $prefix = 'App\Controller\\';

    $r->addRoute('GET', '/', $prefix . 'IndexController:show');
});


$http->on("start", function ($server) {
    echo "Swoole http server is started at http://0.0.0.0:8888\n";
});

$http->on("request", function ($request, $response) use($dispatcher) {
    $response->header("X-Powered-By", "Salamander");
    $_GET = $request->get;
    $_POST = $request->post;
    $_SERVER = $request->server;
    $_COOKIE = $request->cookie;
    $_FILES = $request->files;

    // Fetch method and URI from somewhere
    $httpMethod = $_SERVER['request_method'];
    $uri = $_SERVER['request_uri'];

    // Strip query string (?foo=bar) and decode URI
    if (false !== $pos = strpos($uri, '?')) {
        $uri = substr($uri, 0, $pos);
    }
    $uri = rawurldecode($uri);
    $res = '';

    $routeInfo = $dispatcher->dispatch($httpMethod, $uri);
    switch ($routeInfo[0]) {
        case FastRoute\Dispatcher::NOT_FOUND:
            // ... 404 Not Found
            break;
        case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
            $allowedMethods = $routeInfo[1];
            // ... 405 Method Not Allowed
            break;
        case FastRoute\Dispatcher::FOUND:
            $handler = $routeInfo[1];
            $vars = $routeInfo[2];
            $parts = explode(':', $handler);
            $controller = new $parts[0];
            $method = $parts[1];
            $res = call_user_func_array(array($controller, $method), [$vars]);
            break;
    }
    $response->end($res);
});

$http->start();
複製代碼

注意一下,$request->server中request_method和request_uri都是小寫的key,這和PHP內置寫法不同。 swoole文檔bash

測試

clipboard.png

打包下載

swoole-testswoole

相關文章
相關標籤/搜索