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

資訊專欄INFORMATION COLUMN

一個PHP的微型路由控制器

rollback / 3215人閱讀

摘要:在這個后面執(zhí)行用戶自定義的,這些是在定義回調(diào)函數(shù)的時候一起給定當前需要調(diào)用的列表。而傳統(tǒng)的以正則表達式做映射方式,查找回調(diào)函數(shù)時間不穩(wěn)定,最壞情況需要執(zhí)行一遍所有的正則表達式。

之前使用dispatch, 但是從4.0到現(xiàn)在的8.0 API變動比較大,特別是在最近兩次大的版本的升級,為了保持代碼簡潔丟失了向下兼容的特性。

感覺作者的的核心思想不是很堅定。所以生出了自己造輪子的沖動。

router.lua

這個是一個微型的可以在openresty里面運行的路由控制器,曾經(jīng)幫作者做了一次重大改版,現(xiàn)在還是這個項目第二貢獻者。

其中的思想是很值得借鑒的:

使用樹形結(jié)構(gòu)來保存url和handler的映射關(guān)系。(按照樹形結(jié)構(gòu)查找保證了查找回調(diào)函數(shù)的效率Olog(n),而傳統(tǒng)的以正則表達式做key映射handler方式,查找回調(diào)函數(shù)時間不穩(wěn)定,最壞情況需要執(zhí)行一遍所有的正則表達式)

將reqest method定義成是match函數(shù)的一個封裝形式。便于提供方便的形式來映射路由。

Router

鑒于以上兩個非常好的特性,所以就把這個lua的庫在PHP下面重寫了一遍。同時在寫的過程中加入了一些新的特性:

增加error這個API,一個API提供兩種調(diào)用方式(這個借鑒了dispatch里面的一些特性,有點像jquery的某些方法),可以兼具定義error handler和觸發(fā)error handler的作用。

增加hook API,同樣有兩種調(diào)用方式。

默認觸發(fā)“before”和“after”兩個hook。分別在執(zhí)行真正的handler前后。

在“before”這個hook后面執(zhí)行用戶自定義的hook,這些hook是在定義回調(diào)函數(shù)的時候一起給定當前url需要調(diào)用的hook列表。(當然這些hook全部都要用戶自己定義回調(diào)函數(shù))

安裝

這個微型的路由控制器已經(jīng)提交到packagist網(wǎng)站,可以通過composer工具安裝

composer require lloydzhou/router
此處附README里面的一個例子:
(new Router())
/* 定義錯誤處理函數(shù) */
->error(401, function($message){
    header("Location: /login", true, 302);
    die($message);
})
->error(405, function($message){
    header("Location: /hello/world", true, 302);
})
->error(406, function($message){
    die($message);
})
/* 定義hook函數(shù),除了內(nèi)置默認調(diào)用的before和after,還定義了檢查登錄的auth */
->hook("auth", function($params){
    if ("lloyd" == $params["name"])
    return $params;
    $params["router"]->error(401, "Forbiden");
})
/* 定義after這個鉤子函數(shù),支持json或者jsonp格式輸出 */
->hook("after", function($result, $router){
    if ($result) {
    header("Content-type: application/". ($_GET["jsoncallback"]?"javascript":"json"));
    if ($_GET["jsoncallback"])
        print $_GET["jsoncallback"]. "(". json_encode($result). ")";
    else print json_encode($result);
    }
})
->hook("before", function($params){
    //$params["name"] = "lloydzhou";
    return $params;
})
/* 定義url映射 */
->get("/", function(){
    echo "Hello world !!!";
})
->get("/hello/:name", function($name){
    echo "Hello $name !!!";
})
->get("/hello/:name/again", function($name){
    echo "Hello $name again !!!";
}, "auth")
->get("/hello/:name.:ext", function($name, $ext){
    if ("js" == $ext || "json" == $ext) return array("name"=>$name);
    return array("code"=>1, "msg"=>"error message...");
}, "auth")
/* 程序入口,以當前的url查找對應的處理函數(shù),并獲取變量執(zhí)行該函數(shù) */
->execute();
啟動服務
php -S 0.0.0.0:8888 test.php
測試
curl -vvv 127.0.0.1:8888/hello/
url未能映射成功,觸發(fā)405錯誤處理函數(shù), 自動跳轉(zhuǎn)向 URL: "/hello/world"

curl -vvv 127.0.0.1:8888/hello/lloyd 
返回 "Hello lloyd !!!"

curl -vvv 127.0.0.1:8888/hello/lloyd/again 
返回 "Hello lloyd again !!!"

curl -vvv 127.0.0.1:8888/hello/world/again 
在鉤子函數(shù)auth處理失敗觸發(fā)401錯誤處理函數(shù), 自動跳轉(zhuǎn)到 URL: "/login"

curl -vvv 127.0.0.1:8888/hello/lloyd.json 
支持“/”和“.”作為pathinfo的分隔符,并且和after鉤子函數(shù)配合,返回json格式文本 {"name": "lloyd"}

curl -vvv 127.0.0.1:8888/hello/lloyd.js?jsoncallback=test
返回jsonp格式文本 test({"name": "lloyd"})

curl -vvv 127.0.0.1:8888/hello/lloyd.jsx?jsoncallback=test
最后的后綴名不匹配,輸出錯誤jsonp格式的消息 test({"code":1,"msg":"error message..."})
編譯

開發(fā)環(huán)境使用CRouter替代Router可以自動檢測文件修改時間,并且編譯成原生數(shù)組保存至router.inc.php

(new CRouter("router.inc.php", true))

發(fā)布的時候只需要把路由映射的部分替換成以下兩行代碼即可跳過創(chuàng)建路由映射表的階段。以節(jié)省時間!!!

$router = include("router.inc.php");
$router->execute();
性能

使用樹形結(jié)構(gòu)來保存url和handler的映射關(guān)系。查找URL映射函數(shù)的時候保證了查找回調(diào)函數(shù)的效率O(log n)。

而傳統(tǒng)的以正則表達式做key映射handler方式,查找回調(diào)函數(shù)時間不穩(wěn)定,最壞情況需要執(zhí)行一遍所有的正則表達式。

支持編譯,將映射好的樹形路由映射數(shù)組直接編譯成源碼。不需要每次PHP請求的時候重新切割pathinfo再來生成樹形節(jié)點。以節(jié)省時間!

DEMO

為了一邊測試,一邊完善這個庫。所以使用這個庫結(jié)合另外一個ActiveRecord和MicroTpl 寫了一個簡單的博客,里面基本涵蓋了這幾個庫的API。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/21150.html

相關(guān)文章

  • 你不可不知道20個優(yōu)秀PHP框架

    摘要:每一個開發(fā)者都知道,擁有一個強大的框架可以讓開發(fā)工作變得更加快捷安全和有效。官方網(wǎng)站是一款老牌的框架,現(xiàn)在穩(wěn)定版本已經(jīng)是了。官方網(wǎng)站是由最大的社區(qū)之一的管理開發(fā)的,也是一個開源的框架。 對于Web開發(fā)者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網(wǎng)站都是基于PHP開發(fā)的。 每一個開發(fā)者都知道,擁有一個強大的框架可以讓開發(fā)工作變得更加快捷、安全和有效。在開發(fā)項目之前選...

    zombieda 評論0 收藏0
  • PHP路由性能測試

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

    levy9527 評論0 收藏0
  • 這就是現(xiàn)代php該有樣子(二)

    摘要:所以,是幫助您創(chuàng)建您的項目的測試框架,單元測試。行為驅(qū)動開發(fā)是一個來自測試驅(qū)動開發(fā)的開發(fā)過程。這種語言被稱為,是用來描述被測試的預期的行為。代碼將被測試并且沒有異常。這些標準提出了現(xiàn)代編碼風格。 本文來自medium----原文鏈接; 歡迎作客我們的php&Laravel學習群:109256050 你需要開始使用測試 這是我每天對自己說的話。像很多人一樣,我不會像TDD所建議的那樣測試...

    fevin 評論0 收藏0
  • PHP微型框架設計

    摘要:這些所有的結(jié)構(gòu)都只是該微型框架的一個基本結(jié)構(gòu),實際上復雜的框架會有很多擴展的函數(shù)以及外部插件,可以在這個目錄結(jié)構(gòu)上做出相應調(diào)整。 一、框架整體分析在實現(xiàn)一個框架之前,我們需要了解這個框架應該達到一個怎樣的效果,按照傳統(tǒng)框架的思路,大致可以總結(jié)出以下這么幾條:1.實現(xiàn)MVC架構(gòu),將控制、邏輯、視圖層進行分離。2.封裝各種函數(shù)及功能模塊,實現(xiàn)一處編寫,多處調(diào)用,減少代碼冗余。3.便于擴展,...

    nihao 評論0 收藏0
  • 英特爾發(fā)布凌動C2000等多項新品 助力打造高效云計算數(shù)據(jù)中心

    摘要:新聞焦點英特爾凌動處理器產(chǎn)品家族是首款基于微架構(gòu)的處理器,擁有種可定制化配置,面向微型服務器入門級網(wǎng)絡和冷數(shù)據(jù)存儲。全球領先的托管服務公司與已經(jīng)對英特爾凌動片上系統(tǒng)進行了測試,并計劃于下一季度在其入門級專用托管服務中部署該產(chǎn)品。 新聞焦點 · 英特爾凌動 C2000 處理器產(chǎn)品家族是首款基于 Silvermont 微架構(gòu)的處理器,擁有13 種可定制化配置,面向微型服務器、入門級網(wǎng)絡...

    junbaor 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<