鏈接
https://github.com/nikic/Fast...
這個庫提供了基于正則表達式的快速路由實現。這篇文章解釋了 FastRoute 是如何工作的和它為什么很快。
安裝通過 composer 安裝
composer require nikic/fast-route
要求 PHP 5.4 及更高的版本
使用這是一個基本的使用示例
addRoute("GET", "/users", "get_all_users_handler"); // {id} 必須是一個數字 (d+) $r->addRoute("GET", "/user/{id:d+}", "get_user_handler"); // /{title} 后綴是可選的 $r->addRoute("GET", "/articles/{id:d+}[/{title}]", "get_article_handler"); }); // 獲取請求的方法和 URI $httpMethod = $_SERVER["REQUEST_METHOD"]; $uri = $_SERVER["REQUEST_URI"]; // 去除查詢字符串( ? 后面的內容) 和 解碼 URI if (false !== $pos = strpos($uri, "?")) { $uri = substr($uri, 0, $pos); } $uri = rawurldecode($uri); $routeInfo = $dispatcher->dispatch($httpMethod, $uri); switch ($routeInfo[0]) { case FastRouteDispatcher::NOT_FOUND: // ... 404 Not Found 沒找到對應的方法 break; case FastRouteDispatcher::METHOD_NOT_ALLOWED: $allowedMethods = $routeInfo[1]; // ... 405 Method Not Allowed 方法不允許 break; case FastRouteDispatcher::FOUND: // 找到對應的方法 $handler = $routeInfo[1]; // 獲得處理函數 $vars = $routeInfo[2]; // 獲取請求參數 // ... call $handler with $vars // 調用處理函數 break; }定義路由
通過調用 FastRoutesimpleDispatcher() 函數來定義路由,該函數接受一個以 FastRouteRouteCollector 實例為參數的閉包作為參數。通過在 collector 實例里面調用 addRoute() 增加路由。
$r->addRoute($method, $routePattern, $handler);
$method 是大寫的 HTTP 方法,能夠被某個路由匹配,可以使用數組指定多個有效的 $method 。
// 這里兩行調用 $r->addRoute("GET", "/test", "handler"); $r->addRoute("POST", "/test", "handler"); // 等同于這一行調用 $r->addRoute(["GET", "POST"], "/test", "handler");
默認情況下 $routePattern 使用一種語法,比如 {foo} 是指定名稱為 foo 的占位符,可以匹配正則表達式 [^/]+. 。要調整占位符匹配的模式,可以通過編寫 {bar:[0-9] +} 來指定自定義模式。一些例子
// 匹配 /user/42,不匹配 /user/xyx $r->addRoute("GET", "/user/{id:d+}", "handler"); // 匹配 /user/foobar,不匹配 /user/foo/bar $r->addRoute("GET", "/user/{name}", "handler"); // 匹配 /user/foobar,也匹配 /user/foo/bar $r->addRoute("GET", "/user/{name:.+}", "handler");
路由占位符的自定義模式不能使用捕獲組,例如 {lang:(en|de)} 不是有效的占位符,因為 () 是一個捕獲組,可以使用 {lang:en|de} 或者 {lang:(?:en|de)} 代替。
另外,在路由 [...] 中定義的部分是可選匹配的,所以 /foo[bar] 將匹配 /foo 和 /foobar 。路由可選部分只支持在定義的末尾,而不能在定義的中間。
// 這個路由有,[/{name}] 可選擇匹配部分 $r->addRoute("GET", "/user/{id:d+}[/{name}]", "handler"); // 等同于這兩個路由 $r->addRoute("GET", "/user/{id:d+}", "handler"); $r->addRoute("GET", "/user/{id:d+}/{name}", "handler"); // 多層嵌套可選路由,也是支持的 $r->addRoute("GET", "/user[/{id:d+}[/{name}]]", "handler"); // 這個路由定義無效,因為可選部分只能在定義的末尾 $r->addRoute("GET", "/user[/{id:d+}]/{name}", "handler");
$handler 參數不一定必須是回調函數,它也可以是控制器類名或任何其他類型的數據。FastRoute 只告訴你哪個 handler 對應 URI,如何解釋它取決于你。
請求方法的書寫快捷方式對于 GET、POST、PUT、PATCH、DELETE 和 HEAD 請求方法,可使用快捷方式。
$r->get("/get-route", "get_handler"); $r->post("/post-route", "post_handler"); // 等同于 $r->addRoute("GET", "/get-route", "get_handler"); $r->addRoute("POST", "/post-route", "post_handler");路由組
你可以在一個組內定義路由,同一組內的路由有相同的前綴。
$r->addGroup("/admin", function (RouteCollector $r) { $r->addRoute("GET", "/do-something", "handler"); $r->addRoute("GET", "/do-another-thing", "handler"); $r->addRoute("GET", "/do-something-else", "handler"); }); // 等同于 $r->addRoute("GET", "/admin/do-something", "handler"); $r->addRoute("GET", "/admin/do-another-thing", "handler"); $r->addRoute("GET", "/admin/do-something-else", "handler");
可以定義多層嵌套組結構。
緩存使用 simpleDispatcher 定義路由的回調函數可以無縫緩存。通過使用 cachedDispatcher 而不是 simpleDispatcher,可以緩存生成的路由數據并從緩存的信息構建調度。
addRoute("GET", "/user/{name}/{id:[0-9]+}", "handler0"); $r->addRoute("GET", "/user/{id:[0-9]+}", "handler1"); $r->addRoute("GET", "/user/{name}", "handler2"); }, [ "cacheFile" => __DIR__ . "/route.cache", /* required 緩存文件路徑,必須設置 */ "cacheDisabled" => IS_DEBUG_ENABLED, /* optional, enabled by default 是否緩存,可選參數,默認情況下開啟 */ ]);
該函數的第二個參數是一個選項數組,可用于指定緩存文件路徑等等。
調度 URI通過調用 dispatch() 調度 URI。這個方法接受 HTTP 方法 和一個 URI 作為參數。獲得這兩個信息是你自己的工作,這個庫并不綁定到 PHP web SAPIs 。
dispatch() 返回一個數組,第一個元素是一個狀態碼,狀態碼是 Dispatcher::NOT_FOUND、Dispatcher::METHOD_NOT_ALLOWED、Dispatcher::FOUND 其中之一。對于 Dispatcher::METHOD_NOT_ALLOWED 狀態,第二個數組元素包含允許提供的 URI 的 HTTP 方法列表。
[FastRouteDispatcher::METHOD_NOT_ALLOWED, ["GET", "POST"]]
對于 Dispatcher::FOUND 狀態,第二個數組元素是 $handler ,第三個數組元素是是一個包含所有占位符的數組
/* Routing against GET /user/nikic/42 */ [FastRouteDispatcher::FOUND, "handler0", ["name" => "nikic", "id" => "42"]]重寫路由解析器和調度器
這個庫使用三個組件,一個路由解析器,一個數據生成器,一個調度器。這個三個組件實現以下接口
路由解析器獲取路由模式字符串并將其轉換為路由信息數組,其中每個路線信息又是它的部分數組。
/* The route /user/{id:d+}[/{name}] converts to the following array: */ [ [ "/user/", ["id", "d+"], ], [ "/user/", ["id", "d+"], "/", ["name", "[^/]+"], ], ]然后可以將該數組傳遞給數據生成器的 addRoute() 方法,在添加了所有路由之后,調用生成器的 getData(),它將返回調度器所需的所有路由數據。
調度程序通過構造函數接受路由數據,并提供 dispatch()方法。路由解析器可以被多帶帶覆蓋,然而數據生成器和調度器應該總是一起修改,因為前者的輸出與后者的輸入緊密耦合。
當使用 simpleDispatcher / cachedDispatcher 時,可以通過傳入額外的參數,進行覆蓋
"FastRouteRouteParserStd", "dataGenerator" => "FastRouteDataGeneratorGroupCountBased", "dispatcher" => "FastRouteDispatcherGroupCountBased", ]);上面給出了默認的設置,通過把 GroupCountBased 替換成 GroupPosBased 可以使用完全不同的調度策略
關于HEAD請求的說明HTTP 規范要求服務器 同時支持 GET 和 HEAD 方法
GET和HEAD方法必須得到所有通用服務器的支持為避免強制用戶為每個資源手動注冊 HEAD 路由,將使用一個匹配的 GET 路由響應請求。PHP web SAPI 透明地從 HEAD 響應中移除實體主體,所以這種行為對絕大多數用戶沒有影響。
但是,在 Web SAPI 環境外部使用 FastRoute ,絕不能發送響應 HEAD 請求而生成的實體主體,如果你是非 SAPI 用戶,這是你的責任;在這種情況下,FastRoute 無權限制你破壞 HTTP 。
最后,請注意,應用程序可以始終為給定資源指定其自己的 HEAD 方法路由以完全繞過此行為。
總結文檔還是很好理解,下次就要看源碼了。
原創文章,歡迎轉載。轉載請注明出處,謝謝。
原文鏈接地址:http://dryyun.com/2018/04/20/...
作者: dryyun
發表日期: 2018-04-21 10:14:21
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28662.html
摘要:的路由是使用了這個庫作者寫了一篇帖子介紹了它寫這個庫的原因原文鏈接使用正則的快速路由庫前段時間我在路由庫遇到了一些問題。它號稱比現用的路由庫快幾個數量級的,因為為了達到這個這個目的,這個庫是通過的擴展實現的。 首先先區分一下概念:路由是指一個過程,就是利用定義好的一些規則,讓不同的URI能夠調用不同的處理器(一個匿名函數或者一個類中的方法)這樣一個過程。 平常很多框架所說的定義一個路由...
摘要:使開發人員可以編寫高性能的異步并發,服務。使用作為網絡通信框架,可以使企業研發團隊的效率大大提升,更加專注于開發創新產品。總之,這個庫讓可以常駐內存,并提供了,等功能。 swoole 使 PHP 開發人員可以編寫高性能的異步并發 TCP、UDP、Unix Socket、HTTP,WebSocket 服務。Swoole 可以廣泛應用于互聯網、移動通信、企業軟件、云計算、網絡游戲、物聯網(...
摘要:使開發人員可以編寫高性能的異步并發,服務。使用作為網絡通信框架,可以使企業研發團隊的效率大大提升,更加專注于開發創新產品。總之,這個庫讓可以常駐內存,并提供了,等功能。 swoole 使 PHP 開發人員可以編寫高性能的異步并發 TCP、UDP、Unix Socket、HTTP,WebSocket 服務。Swoole 可以廣泛應用于互聯網、移動通信、企業軟件、云計算、網絡游戲、物聯網(...
摘要:在本文中,我們將借助天文圖庫,使用建立圖片庫。在使用虛擬機時,此處應為,命令將在目錄下運行。我們建議在選擇服務名時,盡量使用完整的類名。這樣,相當于告訴它必須使用指定的類來創建服務。在返回中的最后一個響應之前,應用會緩存該響應以備下次使用。 在本文中,我們將借助 NASA 天文圖庫 API,使用 Zend Expressive 建立圖片庫。最后的結果將顯示在 AstroSpla...
閱讀 2568·2021-10-11 10:58
閱讀 1150·2021-09-29 09:34
閱讀 1489·2021-09-26 09:46
閱讀 3831·2021-09-22 15:31
閱讀 733·2019-08-30 15:54
閱讀 1459·2019-08-30 13:20
閱讀 1253·2019-08-30 13:13
閱讀 1488·2019-08-26 13:52