国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

FastRoute - 快速請(qǐng)求路由

mist14 / 910人閱讀

鏈接
https://github.com/nikic/Fast...

這個(gè)庫(kù)提供了基于正則表達(dá)式的快速路由實(shí)現(xiàn)。這篇文章解釋了 FastRoute 是如何工作的和它為什么很快。

安裝

通過(guò) composer 安裝

composer require nikic/fast-route

要求 PHP 5.4 及更高的版本

使用

這是一個(gè)基本的使用示例

addRoute("GET", "/users", "get_all_users_handler");
    // {id} 必須是一個(gè)數(shù)字 (d+)
    $r->addRoute("GET", "/user/{id:d+}", "get_user_handler");
    //  /{title} 后綴是可選的
    $r->addRoute("GET", "/articles/{id:d+}[/{title}]", "get_article_handler");
});

// 獲取請(qǐng)求的方法和 URI
$httpMethod = $_SERVER["REQUEST_METHOD"];
$uri = $_SERVER["REQUEST_URI"];

// 去除查詢字符串( ? 后面的內(nèi)容) 和 解碼 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 沒(méi)找到對(duì)應(yīng)的方法
        break;
    case FastRouteDispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        // ... 405 Method Not Allowed  方法不允許
        break;
    case FastRouteDispatcher::FOUND: // 找到對(duì)應(yīng)的方法
        $handler = $routeInfo[1]; // 獲得處理函數(shù)
        $vars = $routeInfo[2]; // 獲取請(qǐng)求參數(shù)
        // ... call $handler with $vars // 調(diào)用處理函數(shù)
        break;
}
定義路由

通過(guò)調(diào)用 FastRoutesimpleDispatcher() 函數(shù)來(lái)定義路由,該函數(shù)接受一個(gè)以 FastRouteRouteCollector 實(shí)例為參數(shù)的閉包作為參數(shù)。通過(guò)在 collector 實(shí)例里面調(diào)用 addRoute() 增加路由。

$r->addRoute($method, $routePattern, $handler);

$method 是大寫(xiě)的 HTTP 方法,能夠被某個(gè)路由匹配,可以使用數(shù)組指定多個(gè)有效的 $method 。

// 這里兩行調(diào)用
$r->addRoute("GET", "/test", "handler");
$r->addRoute("POST", "/test", "handler");
// 等同于這一行調(diào)用
$r->addRoute(["GET", "POST"], "/test", "handler");

默認(rèn)情況下 $routePattern 使用一種語(yǔ)法,比如 {foo} 是指定名稱為 foo 的占位符,可以匹配正則表達(dá)式 [^/]+. 。要調(diào)整占位符匹配的模式,可以通過(guò)編寫(xiě) {bar:[0-9] +} 來(lái)指定自定義模式。一些例子

// 匹配 /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)} 不是有效的占位符,因?yàn)?() 是一個(gè)捕獲組,可以使用 {lang:en|de} 或者 {lang:(?:en|de)} 代替。

另外,在路由 [...] 中定義的部分是可選匹配的,所以 /foo[bar] 將匹配 /foo/foobar 。路由可選部分只支持在定義的末尾,而不能在定義的中間。

// 這個(gè)路由有,[/{name}] 可選擇匹配部分
$r->addRoute("GET", "/user/{id:d+}[/{name}]", "handler");
// 等同于這兩個(gè)路由
$r->addRoute("GET", "/user/{id:d+}", "handler");
$r->addRoute("GET", "/user/{id:d+}/{name}", "handler");

// 多層嵌套可選路由,也是支持的
$r->addRoute("GET", "/user[/{id:d+}[/{name}]]", "handler");

// 這個(gè)路由定義無(wú)效,因?yàn)榭蛇x部分只能在定義的末尾
$r->addRoute("GET", "/user[/{id:d+}]/{name}", "handler");

$handler 參數(shù)不一定必須是回調(diào)函數(shù),它也可以是控制器類名或任何其他類型的數(shù)據(jù)。FastRoute 只告訴你哪個(gè) handler 對(duì)應(yīng) URI,如何解釋它取決于你。

請(qǐng)求方法的書(shū)寫(xiě)快捷方式

對(duì)于 GET、POST、PUT、PATCH、DELETE 和 HEAD 請(qǐng)求方法,可使用快捷方式。

$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");
路由組

你可以在一個(gè)組內(nèi)定義路由,同一組內(nèi)的路由有相同的前綴。

$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");

可以定義多層嵌套組結(jié)構(gòu)。

緩存

使用 simpleDispatcher 定義路由的回調(diào)函數(shù)可以無(wú)縫緩存。通過(guò)使用 cachedDispatcher 而不是 simpleDispatcher,可以緩存生成的路由數(shù)據(jù)并從緩存的信息構(gòu)建調(diào)度。

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 緩存文件路徑,必須設(shè)置 */
    "cacheDisabled" => IS_DEBUG_ENABLED,     /* optional, enabled by default 是否緩存,可選參數(shù),默認(rèn)情況下開(kāi)啟 */
]);

該函數(shù)的第二個(gè)參數(shù)是一個(gè)選項(xiàng)數(shù)組,可用于指定緩存文件路徑等等。

調(diào)度 URI

通過(guò)調(diào)用 dispatch() 調(diào)度 URI。這個(gè)方法接受 HTTP 方法 和一個(gè) URI 作為參數(shù)。獲得這兩個(gè)信息是你自己的工作,這個(gè)庫(kù)并不綁定到 PHP web SAPIs 。
dispatch() 返回一個(gè)數(shù)組,第一個(gè)元素是一個(gè)狀態(tài)碼,狀態(tài)碼是 Dispatcher::NOT_FOUNDDispatcher::METHOD_NOT_ALLOWEDDispatcher::FOUND 其中之一。對(duì)于 Dispatcher::METHOD_NOT_ALLOWED 狀態(tài),第二個(gè)數(shù)組元素包含允許提供的 URI 的 HTTP 方法列表。

[FastRouteDispatcher::METHOD_NOT_ALLOWED, ["GET", "POST"]]

對(duì)于 Dispatcher::FOUND 狀態(tài),第二個(gè)數(shù)組元素是 $handler ,第三個(gè)數(shù)組元素是是一個(gè)包含所有占位符的數(shù)組

/* Routing against GET /user/nikic/42 */

[FastRouteDispatcher::FOUND, "handler0", ["name" => "nikic", "id" => "42"]]
重寫(xiě)路由解析器和調(diào)度器

這個(gè)庫(kù)使用三個(gè)組件,一個(gè)路由解析器,一個(gè)數(shù)據(jù)生成器,一個(gè)調(diào)度器。這個(gè)三個(gè)組件實(shí)現(xiàn)以下接口


路由解析器獲取路由模式字符串并將其轉(zhuǎn)換為路由信息數(shù)組,其中每個(gè)路線信息又是它的部分?jǐn)?shù)組。

/* The route /user/{id:d+}[/{name}] converts to the following array: */
[
    [
        "/user/",
        ["id", "d+"],
    ],
    [
        "/user/",
        ["id", "d+"],
        "/",
        ["name", "[^/]+"],
    ],
]

然后可以將該數(shù)組傳遞給數(shù)據(jù)生成器的 addRoute() 方法,在添加了所有路由之后,調(diào)用生成器的 getData(),它將返回調(diào)度器所需的所有路由數(shù)據(jù)。
調(diào)度程序通過(guò)構(gòu)造函數(shù)接受路由數(shù)據(jù),并提供 dispatch()方法。

路由解析器可以被多帶帶覆蓋,然而數(shù)據(jù)生成器和調(diào)度器應(yīng)該總是一起修改,因?yàn)榍罢叩妮敵雠c后者的輸入緊密耦合。

當(dāng)使用 simpleDispatcher / cachedDispatcher 時(shí),可以通過(guò)傳入額外的參數(shù),進(jìn)行覆蓋

 "FastRouteRouteParserStd",
    "dataGenerator" => "FastRouteDataGeneratorGroupCountBased",
    "dispatcher" => "FastRouteDispatcherGroupCountBased",
]);

上面給出了默認(rèn)的設(shè)置,通過(guò)把 GroupCountBased 替換成 GroupPosBased 可以使用完全不同的調(diào)度策略

關(guān)于HEAD請(qǐng)求的說(shuō)明

HTTP 規(guī)范要求服務(wù)器 同時(shí)支持 GET 和 HEAD 方法

GET和HEAD方法必須得到所有通用服務(wù)器的支持

為避免強(qiáng)制用戶為每個(gè)資源手動(dòng)注冊(cè) HEAD 路由,將使用一個(gè)匹配的 GET 路由響應(yīng)請(qǐng)求。PHP web SAPI 透明地從 HEAD 響應(yīng)中移除實(shí)體主體,所以這種行為對(duì)絕大多數(shù)用戶沒(méi)有影響。

但是,在 Web SAPI 環(huán)境外部使用 FastRoute ,絕不能發(fā)送響應(yīng) HEAD 請(qǐng)求而生成的實(shí)體主體,如果你是非 SAPI 用戶,這是你的責(zé)任;在這種情況下,F(xiàn)astRoute 無(wú)權(quán)限制你破壞 HTTP 。

最后,請(qǐng)注意,應(yīng)用程序可以始終為給定資源指定其自己的 HEAD 方法路由以完全繞過(guò)此行為。

總結(jié)

文檔還是很好理解,下次就要看源碼了。

原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)注明出處,謝謝。
原文鏈接地址:http://dryyun.com/2018/04/20/...
作者: dryyun
發(fā)表日期: 2018-04-21 10:14:21

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/28662.html

相關(guān)文章

  • 翻譯 使用正則的快速路由庫(kù)

    摘要:的路由是使用了這個(gè)庫(kù)作者寫(xiě)了一篇帖子介紹了它寫(xiě)這個(gè)庫(kù)的原因原文鏈接使用正則的快速路由庫(kù)前段時(shí)間我在路由庫(kù)遇到了一些問(wèn)題。它號(hào)稱比現(xiàn)用的路由庫(kù)快幾個(gè)數(shù)量級(jí)的,因?yàn)闉榱诉_(dá)到這個(gè)這個(gè)目的,這個(gè)庫(kù)是通過(guò)的擴(kuò)展實(shí)現(xiàn)的。 首先先區(qū)分一下概念:路由是指一個(gè)過(guò)程,就是利用定義好的一些規(guī)則,讓不同的URI能夠調(diào)用不同的處理器(一個(gè)匿名函數(shù)或者一個(gè)類中的方法)這樣一個(gè)過(guò)程。 平常很多框架所說(shuō)的定義一個(gè)路由...

    Lionad-Morotar 評(píng)論0 收藏0
  • PHP路由性能測(cè)試

    摘要:路由控制器性能測(cè)試前言前段時(shí)間抽空寫(xiě)了個(gè)微型路由控制器可以在我的另一篇文章里面看到詳細(xì)的介紹。上門有測(cè)試以及這幾個(gè)路由控制器的性能,總體來(lái)說(shuō)和在最壞的情況下表現(xiàn)最好。同樣的測(cè)試條件。所以本次測(cè)試僅僅針對(duì),以及。 PHP路由控制器性能測(cè)試 前言 前段時(shí)間抽空寫(xiě)了個(gè)微型路由控制器可以在我的另一篇文章里面看到詳細(xì)的介紹。雖然在設(shè)計(jì)的時(shí)候及盡量避開(kāi)了正則匹配和數(shù)組循環(huán)這種耗時(shí)的操作。盡量節(jié)省時(shí)...

    levy9527 評(píng)論0 收藏0
  • Just for fun——基于Swoole做個(gè)小框架

    摘要:使開(kāi)發(fā)人員可以編寫(xiě)高性能的異步并發(fā),服務(wù)。使用作為網(wǎng)絡(luò)通信框架,可以使企業(yè)研發(fā)團(tuán)隊(duì)的效率大大提升,更加專注于開(kāi)發(fā)創(chuàng)新產(chǎn)品。總之,這個(gè)庫(kù)讓可以常駐內(nèi)存,并提供了,等功能。 swoole 使 PHP 開(kāi)發(fā)人員可以編寫(xiě)高性能的異步并發(fā) TCP、UDP、Unix Socket、HTTP,WebSocket 服務(wù)。Swoole 可以廣泛應(yīng)用于互聯(lián)網(wǎng)、移動(dòng)通信、企業(yè)軟件、云計(jì)算、網(wǎng)絡(luò)游戲、物聯(lián)網(wǎng)(...

    CoreDump 評(píng)論0 收藏0
  • Just for fun——基于Swoole做個(gè)小框架

    摘要:使開(kāi)發(fā)人員可以編寫(xiě)高性能的異步并發(fā),服務(wù)。使用作為網(wǎng)絡(luò)通信框架,可以使企業(yè)研發(fā)團(tuán)隊(duì)的效率大大提升,更加專注于開(kāi)發(fā)創(chuàng)新產(chǎn)品。總之,這個(gè)庫(kù)讓可以常駐內(nèi)存,并提供了,等功能。 swoole 使 PHP 開(kāi)發(fā)人員可以編寫(xiě)高性能的異步并發(fā) TCP、UDP、Unix Socket、HTTP,WebSocket 服務(wù)。Swoole 可以廣泛應(yīng)用于互聯(lián)網(wǎng)、移動(dòng)通信、企業(yè)軟件、云計(jì)算、網(wǎng)絡(luò)游戲、物聯(lián)網(wǎng)(...

    fevin 評(píng)論0 收藏0
  • 如何使用 Zend Expressive 建立 NASA 圖片庫(kù)?

    摘要:在本文中,我們將借助天文圖庫(kù),使用建立圖片庫(kù)。在使用虛擬機(jī)時(shí),此處應(yīng)為,命令將在目錄下運(yùn)行。我們建議在選擇服務(wù)名時(shí),盡量使用完整的類名。這樣,相當(dāng)于告訴它必須使用指定的類來(lái)創(chuàng)建服務(wù)。在返回中的最后一個(gè)響應(yīng)之前,應(yīng)用會(huì)緩存該響應(yīng)以備下次使用。 在本文中,我們將借助 NASA 天文圖庫(kù) API,使用 Zend Expressive 建立圖片庫(kù)。最后的結(jié)果將顯示在 AstroSpla...

    hidogs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<