swoole
使 PHP 開發人員可以編寫高效能的非同步併發 TCP、UDP、Unix Socket、HTTP,WebSocket 服務。Swoole 可以廣泛應用於網際網路、行動通訊、企業軟體、雲端計算、網路遊戲、物聯網(IOT)、車聯網、智慧家居等領域。 使用 PHP + Swoole 作為網路通訊框架,可以使企業 IT 研發團隊的效率大大提升,更加專注於開發創新產品。
總之,這個庫讓PHP可以常駐記憶體,並提供了http server,tcp server等功能。
docker-compose.xml
利用docker,快速生成帶swoole擴充套件的PHP環境,salamanderphp-cli
這個映象,預設執行的是目錄下public目錄中server.php
檔案
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,當然,別的庫肯定也是可以的。
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文件