问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求FAST路由器设置方法

发布网友 发布时间:2022-04-06 14:27

我来回答

5个回答

懂视网 时间:2022-04-06 18:49

这个库提供了基于正则表达式的快速路由实现。这篇文章解释了 FastRoute 是如何工作的和它为什么很快。

安装

通过 composer 安装

composer require nikic/fast-route

要求 PHP 5.4 及更高的版本

使用

这是一个基本的使用示例

<?php
require '/path/to/vendor/autoload.php';
$dispatcher = FastRoutesimpleDispatcher(function(FastRouteRouteCollector $r) {
 $r->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,如何解释它取决于你。

请求方法的书写快捷方式

对于 GETPOSTPUTPATCHDELETE 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,可以缓存生成的路由数据并从缓存的信息构建调度。

<?php
$dispatcher = FastRoutecachedDispatcher(function(FastRouteRouteCollector $r) {
 $r->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_FOUNDDispatcher::METHOD_NOT_ALLOWEDDispatcher::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']]

重写路由解析器和调度器

这个库使用三个组件,一个路由解析器,一个数据生成器,一个调度器。这个三个组件实现以下接口

<?php
namespace FastRoute;
interface RouteParser {
 public function parse($route);
}
interface DataGenerator {
 public function addRoute($httpMethod, $routeData, $handler);
 public function getData();
}
interface Dispatcher {
 const NOT_FOUND = 0, FOUND = 1, METHOD_NOT_ALLOWED = 2;
 public function dispatch($httpMethod, $uri);
}

路由解析器获取路由模式字符串并将其转换为路由信息数组,其中每个路线信息又是它的部分数组。

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

然后可以将该数组传递给数据生成器的 addRoute() 方法,在添加了所有路由之后,调用生成器的 getData(),它将返回调度器所需的所有路由数据。

调度程序通过构造函数接受路由数据,并提供 dispatch()方法。

路由解析器可以被单独覆盖,然而数据生成器和调度器应该总是一起修改,因为前者的输出与后者的输入紧密耦合。

当使用 simpleDispatcher / cachedDispatcher 时,可以通过传入额外的参数,进行覆盖

<?php
$dispatcher = FastRoutesimpleDispatcher(function(FastRouteRouteCollector $r) {
 /* ... */
}, [
 'routeParser' => 'FastRouteRouteParserStd',
 'dataGenerator' => 'FastRouteDataGeneratorGroupCountBased',
 'dispatcher' => 'FastRouteDispatcherGroupCountBased',
]);

上面给出了默认的设置,通过把 GroupCountBased 替换成 GroupPosBased 可以使用完全不同的调度策略

关于HEAD请求的说明

HTTP 规范要求服务器 同时支持 GET HEAD 方法

GETHEAD方法必须得到所有通用服务器的支持

为避免强制用户为每个资源手动注册 HEAD 路由,将使用一个匹配的 GET 路由响应请求。PHP web SAPI 透明地从 HEAD 响应中移除实体主体,所以这种行为对绝大多数用户没有影响。

但是,在 Web SAPI 环境外部使用 FastRoute ,绝不能发送响应 HEAD 请求而生成的实体主体,如果你是非 SAPI 用户,这是你的责任;在这种情况下,FastRoute 无权限制你破坏 HTTP 。

最后,请注意,应用程序可以始终为给定资源指定其自己的 HEAD 方法路由以完全绕过此行为。

热心网友 时间:2022-04-06 15:57

可能是路由器有问题,你把路由器停电20分钟再用,或者停电后用大头针之类的东西按着路由器上的一个小孔10秒左右,试试.

热心网友 时间:2022-04-06 17:15

恢复出厂设置,重新设置,检查硬件连线,WAN口未连接,主线WAN口,连电脑LAN口。

热心网友 时间:2022-04-06 18:49

设置路由器应该插到LAN口!与WAN口没有关系。

热心网友 时间:2022-04-06 20:57

http://www.fastcom.com.cn/downloadfilesuploadfolder/201047174353.pdf
具体设置参考上头吧
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 掌盟上的这个黑条是怎么弄得? 在京东自营上买的东西,申请了退款申请,结果有取消了,怎么确认收货? 2007-2014年国际原油期货价格是多少 全球经济衰退加深抑制了石油需求,国际石油价格大幅下滑,纽约商业交易所(NYMEX)原油期货2008年12月19 2008年1月2日,纽约商品交易所2月份交货的轻质原油期货价格在电子交易中达到每桶100美元,这一价格刷新了 2008年国内外十大新闻都有什么啊拜托各位了 3Q (18分)材料一 2008年1月2日,国际原油期货价格在历史上首度突破每桶100美元大关。2008年3月7日又创新 2008年度世界经济形势有哪些新看点? 2008 年1月2日,国际原油期货价格首次突破每桶100 美元大关。引起油价飙升的原因包括中东局势的紧张、产 谁知道2008年国际原油期货最高价格到过多少? 杭州银行信用卡在支付宝上消费有积分吗 鸭掌木只浇水不施肥可以吗 鸭掌木缺水是什么样子 培育鸭掌木有什么需要注意的么?怎么浇水?温度什么的? 鸭掌木怎么养!?每天要浇多少水?? 鸭掌木能用肥皂水浇花吗? 鸭脚木浇硫酸亚铁水可以吗? 鸭掌木要多久浇一次水? 鸭掌木怎么浇水 鸭掌木如何浇水? 如何把桌面word发到朋友圈 WORD如何放到朋友圈? 能把ppt word上传到网站上并可以分享到朋友圈的网站? 吃辣椒胃疼了怎么缓解 辣椒吃多胃难受怎么办 吃太辣胃疼怎么办 吃太辣胃疼怎么缓解 吃多了辣地怎样缓解胃痛? 今天吃辣椒后胃疼怎么办呢? 西铁城光动能手表怎么校准时间啊,发现与标准时间慢了十几秒,误差怎么这... 怎样使用FAST路由器将两台电脑连接 湖北省招聘教师考试,在哪个网站上报名以及查询呢 是招聘老师考试,不是考教师资格证 湖北省教师编制的信息在哪查啊! 如何评价美国“国家级”男演员汤姆克鲁斯? 武汉市考教师编制的考试什么时间考?考哪些内容?在什么地方报名? 你认为美国男明星最红的是谁? 湖北宜昌市教育局教师招聘考试报名 美国男明星,曾饰演乱世佳人中的白瑞德 新开的公司的销售提成方案应该怎么设立呢,一般销售员,销售经理,应该如何设置比较合理?谢谢 请大家能给个销售平均提成的方案 公司销售提成方案