Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
5
篇与
的结果
2023-08-12
PHP单文件路由类
PHP单文件路由类路由类Router.php<?phpclass Router { private $routes = []; private $routeCount = 0; public function addRoute($method, $url, $callback) { $this->routes[] = ['method' => $method, 'url' => $url, 'callback' => $callback]; $this->routeCount++; } public function doRouting() { $is_match=0; // I used PATH_INFO instead of REQUEST_URI, because the // application may not be in the root direcory // and we dont want stuff like ?var=value $reqUrl = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);//$_SERVER['PATH_INFO']; if ($reqUrl == null) { $reqUrl = ''; } $reqMet = $_SERVER['REQUEST_METHOD']; foreach ($this->routes as $route) { // convert urls like '/users/:uid/posts/:pid' to regular expression $patterns = array('/\[[a-zA-Z0-9\_\-\/]+\]/','/\[{[a-zA-Z0-9\_\-}]+\]/','/\[\/{[a-zA-Z0-9\_\-}]+\]/','/{[a-zA-Z0-9\_\-}]+/'); $replace = array('([a-zA-Z0-9\-\_\/]*)','([a-zA-Z0-9\-\_]*)','([a-zA-Z0-9\-\_\/]*)','([a-zA-Z0-9\-\_]+)'); // $pattern = "@^" . preg_replace('/\\\:[a-zA-Z0-9\_\-]+/', '([a-zA-Z0-9\-\_]+)', preg_quote($route['url'])) . "$@D"; $pattern = "@^" . preg_replace($patterns, $replace, $route['url']) . "$@D"; $matches = array(); // check if the current request matches the expression if (preg_match($pattern, $reqUrl, $matches)) { // remove the first match array_shift($matches); foreach ($matches as $key => $value) { if (empty($value)) { unset($matches[$key]); } } // call the callback with the matched positions as params if ($route['method'] !=='*' && $reqMet !=='HEAD' && ( !empty($route['method']) && !in_array($reqMet, explode(',', $route['method']))) ) { throw new Exception("405 Not Allowed"); } return call_user_func_array($route['callback'], $matches); } else { $is_match++; } } if ($is_match == $this->routeCount) { throw new Exception("404 Not Found"); } } } //autoload // spl_autoload_register(function ($class_name) { // require_once __DIR__ . '/' . str_replace('\\', '/', $class_name) . '.php'; // }); 路由配置文件config/route.php <?php return [ [ ['GET'], '/', [new App\Index, 'index'], ], [ ['GET'], '/search', [new App\Index, 'search'], ], [ ['GET'], '/tool-[id][/]', [new App\Index, 'tool'], ], [ ['GET'], '/tool-[id]', [new App\Index, 'tool'], ], [ ['GET'], '/category-[cid].html', [new App\Index, 'category'], ], [ ['PUT,GET'], '/hello', function () { echo 'Hello AmazePHP!'; }, ], [ ['GET'], '/hello2', 'callbackFunction', ], [ ['GET'], '/hello44.php', function () { include 'App/aaaaa.php'; }, ], [ ['GET'], '/hello3/[id]', [new App\Foo, 'bar'],////object, method ], [ ['GET'], '/a/[uid]/b[/pid]', ['App\myclass', 'say_hello'],//static method ], [ ['GET,POST'], '/users', function () { echo 'post AmazePHP'; }, ], [ ['*'], '/users/[uid]/posts/[pid]', function ($uid, $pid = 99) { var_dump($uid, $pid); }, ], ];使用方法index.php include 'lib/Router.php'; include 'config/route.php'; $router = new Router(); foreach (config('route') as $key => $value) { $router->addRoute($value[0][0], $value[1], $value[2]); } $router->doRouting();
2023年08月12日
16 阅读
0 评论
0 点赞
2023-08-11
php 路由实现类,基于fastroute
php 路由实现类,基于fastroute<?php /** * 核心路由查找器 */ use FastRoute\RouteCollector; use function FastRoute\simpleDispatcher; use function FastRoute\cachedDispatcher; class FastRoute { public function __construct() { /** @var object $dispatcher 导入配置中的路由规则 */ // $dispatcher = simpleDispatcher(function (RouteCollector $r) { $dispatcher = cachedDispatcher(function (RouteCollector $r) { foreach ($GLOBALS['routeConfig'] as $key => $value) { if ($key) { $r->addGroup($key, function (RouteCollector $r) use ($key, $value) { foreach ($value as $k => $v) { // 如果控制器配置项为空时,默认根据路由获取控制器 $r->addRoute($v[0], $v[1], substr($key, 1) . ucfirst(empty($v[2]) ? $v[2] = substr($v[1], 1) . 'Controller' : $v[2])); } }); } else { foreach ($value as $k => $v) { $r->addRoute($v[0], $v[1], substr($v[2], 0, 1) === '/' ? substr(empty($v[2]) ? $v[2] = substr($v[1], 1) . 'Controller' : $v[2], 1) : $v[2]); } } } } ,[ 'cacheFile' => BASE_PATH . '/cache/route/route.cache', /* required */ 'cacheDisabled' => DEBUG, /* optional, enabled by default */ ]); // 获取http传参方式和资源URI $httpMethod = $_SERVER['REQUEST_METHOD']; $uri = $_SERVER['REQUEST_URI']; // 将url中的get传参方式(?foo=bar)剥离并对URI进行解析 if (false !== $pos = strpos($uri, '?')) { $uri = substr($uri, 0, $pos); } $uri = rawurldecode($uri); $routeInfo = $dispatcher->dispatch($httpMethod, $uri); switch ($routeInfo[0]) { // 使用未定义格式路由 case FastRoute\Dispatcher::NOT_FOUND: if (!DEBUG) { error(404,'404'); } else { throw new \Whoops\Exception\ErrorException('未定义此路由或未在新建文件后使用composer dump-autoload'); } break; /** * 请求的HTTP⽅法与配置的不符合 * HTTP规范要求405 Method Not Allowed响应包含“Allow:”头, * 用以详细说明所请求资源的可用方法。 * 使用FastRoute的应用程序在返回405响应时, * 应使用数组的第二个元素添加此标头。 */ case FastRoute\Dispatcher::METHOD_NOT_ALLOWED: $allowedMethods = $routeInfo[1]; header('HTTP/1.1 405 Method Not Allowed'); $allow = implode(',', $allowedMethods); header('Allow:' . $allow); $errorMsg = "请求方式非法,可使用的请求方式为: $allow"; if ($_SERVER['REQUEST_METHOD'] === 'GET') { error(405, $errorMsg); } else { exit($errorMsg); } break; // 正常 case FastRoute\Dispatcher::FOUND: $handler = $routeInfo[1]; $class = '\app\controllers\\' . ucfirst($handler); $vars = $routeInfo[2]; $action = ucfirst(isset($vars['action']) ? $vars['action'] : 'index'); unset($vars['action']); $_SESSION['route'] = [ 'class' => substr($handler, 0, strpos(strtolower($handler), 'controller')), 'action' => strtolower(substr($action, 6)) ]; // ... 调用$handler和$vars echo call_user_func_array([ new $class, $action ], $vars); break; } } }路由配置文件<?php /** * 路由配置文件 */ return [ [ // 指向首页 [ ['GET', 'POST'], '/', 'HomeController' ], [ ['GET', 'POST'], '/demo', 'DemoController' ], // 指向adminController [ 'GET', '/admin', '' ], // 指向错误页面 [ 'GET', '/error/{code:\d+}', 'demoController' ], [ 'GET', '/user[/{action}]', 'userController' ], /*['GET','/user/{id:\d+}/{name}','userController'],*/ ], // 后台路由 '/admin' => [ // 指向adminUserController [ 'GET', '/user', '' ] ] ];
2023年08月11日
28 阅读
0 评论
0 点赞
2023-08-11
laravel万能路由( 自动路由、动态路由)实现方法分享
laravel万能路由( 自动路由、动态路由)实现方法分享有了万能路由就不用一条一条添加路由了,很方便。如果你要用资源控制器做Restful接口,那还是要写资源路由的,注意,资源路由一定要写在最上面。Route::resource('photos', 'PhotoController');//资源路由要写在上面。//万能路由Route::group(['middleware'=>['web']],function (){Route::any("/{module}/{controller}/{action}",function ($module,$class,$action){ $class = "App\\Http\\Controllers\$module\\".ucfirst(strtolower($class)).'Controller'; if(class_exists($class)) { $ctrl = \App::make($class); return \App::call([$ctrl, $action]); } return abort(404); })->where([ 'module'=>'[0-9a-zA-Z]+','class' => '[0-9a-zA-Z]+', 'action' => '[0-9a-zA-Z]+']);});在你的控制器方法中获取参数要用(Request $request)public function index(Request $request){ $name = $request->input('name'); echo $name; }友好url:如果你想拥有http://www.laravel65.com/Haha/photo/index/id/22/tag/php 这样的友好url请使用以下Route::resource('photos', 'PhotoController');//资源路由要写在上面。Route::get('/', function () {return view('welcome');});//万能路由Route::group(['middleware'=>['web']],function (){Route::any("/{search}",function ($search){ $urls=explode('/',$search); $module=$urls[0] ?? 'Index'; $className=$urls[1] ?? 'Index'; $action=$urls[2] ?? 'Index'; $class ="App\\Http\\Controllers\$module\\".ucfirst(strtolower($className)).'Controller'; $ctrl = \App::make($class); return \App::call([$ctrl, $action],[$search]); // } return abort(404); })->where('search', '.*');});同时在你控制器的方法中使用$search参数接收参数public function index(Request $request,$search){ var_dump($search); $name = $request->input('id'); echo 'index' .$name; }
2023年08月11日
10 阅读
0 评论
0 点赞
2023-08-09
PHP路由技术的原理与实践
PHP路由技术的原理与实践0×00 路由实现原理用户通过指定的URL范式对后台进行访问,URL路由处理类进行处理后,转发到逻辑处理类,逻辑处理类将请求结果返回给用户。约定URL范式和规则约定一套自己喜欢的,对搜索引擎友好,对用户友好的URL规则URL处理类(即路由实现的核心)对用户请求的URL进行解析处理,获取到用户请求的类,方法,以及Query参数等,并将请求转发给逻辑处理类。逻辑处理类处理网站的真实业务逻辑。0×01 URL范式约定目前来说,有两种比较流行的URL格式,一种是普通模式,一种是 pathinfo 模式。普通模式在 ThinkPHP 框架中,默认的URL格式即为普通模式,普通模式URL如下:index.php?m=home&c=user&a=login&v=value其中 m 参数的值为模块名称, c 参数的值为控制器名称, a 参数的值为方法名称,之后的参数则为该方法中所要接收的其他 GET 请求参数pathinfo模式在 CodeIgniter 框架中,默认的URL格式为 pathinfo 模式,如下:index.php/controller/method/prarme1/value1这块的意义也已经标注的很明白了,在 method 以后,就是方法接收的 GET 参数了,格式就是 名称/值0×02 URL路由处理类(核心)此处我们选用最简单的普通单模块模式进行演示,只为说明简单的原理,如下:index.php?c=user&a=login&v=value我们约定参数 c 为控制器名称,参数 a 为方法名称,之后的均是 GET 参数<?phpinclude 'index.class.php';include 'user.class.php';// 对用户请求URL进行处理$query = $_GET;$controller = isset($query['c']) ? $query['c'] : 'indexController';$action = isset($query['a']) ? $query['a'] : 'index';if (class_exists($controller)) {if (method_exists($controller, $action)) {unset($_GET['c']);unset($_GET['a']);// 实例化用户请求类并调用方法(new $controller())->$action();} else {echo '控制器' . $controller . '中不存在方法' . $action;}} else {echo '不存在控制器' . $controller;}其中 unset() 掉两个get参数,只是为了对真正调用的方法造成其他影响。0×03 逻辑处理类逻辑处理类就是最终的业务逻辑,也就是真正的回应用户请求的代码片段。下面只是一个简单的示例:/ index.class.php 文件源码 /<?phpclass indexController {public function index(){var_dump($_GET);}}/ user.class.php 文件源码 /<?phpclass user {public function index() {echo '这里是User控制器';}public function login() {var_dump($_GET);}}0×04 结束这里只是最简单的PHP路由技术的原理,其实真正为一个项目或者框架进行路由开发,可能需要能够兼容很多复杂的情况,需要对各种情况都要考虑到。
2023年08月09日
12 阅读
0 评论
0 点赞
2023-08-07
PHP的路由浅析
PHP的路由浅析1.什么是php的路由机制1、路由机制就是把某一个特定形式的URL结构中提炼出来系统对应的参数。举个例子,如:http://main.wopop.com/article/1 其中:/article/1 -> ?_m=article&id=1。2、然后将拥有对应参数的URL转换成特定形式的URL结构,是上面的过程的逆向过程。2.PHP的URL路由方式总体来说就是:获取路径信息->处理路径信息URL路由方式:第一种是通过url参数进行映射的方式,一般是两个参数,分别代表控制器类和方法比如index.php?c=index&m=index映射到的是index控制器的index方法。第二种,是通过url-rewrite的方式,这样的好处是可以实现对非php结尾的其他后缀进行映射,当然通过rewrite也可以实现第一种方式,不过纯使用rewrite的也比较常见,一般需要配置apache或者nginx的rewrite规则RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]第三种,就是通过pathinfo的方式,所谓的pathinfo,就是形如这样的url。xxx.com/index.php/c/index/aa/cc,apache在处理这个url的时候会把index.php后面的部分输入到环境变量$_SERVER['PATH_INFO'],它等于/c/index/aa/cc。然后我们的路由器再通过解析这个串进行分析就可以了,后面的部分放入到参数什么地方的,就依据各个框架不同而不同了。一个简单的PHP路由实现3.1 修改htaccess文件编写服务器apache或IIS自带的rewrite文件,将URL结构导入指定文件比如:index.php。开启rewrite:htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。启用.htaccess,需要修改apache/conf/httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。Options FollowSymLinksAllowOverride None改为Options FollowSymLinksAllowOverride All然后我写了这样的rewrite:RewriteEngine on #rewriteengine为重写引擎开关on为开启off为关闭RewriteCond $1 !^(index.php.php|images|robots.txt)RewriteRule ([a-zA-Z]{1,})-([0-9]{1,}).html$ sharexie/test.php?action=$1&id=$2([a-zA-Z]{1,})-([0-9]{1,}).html$是规则,sharexie/test.php?action=$1&id=$2是要替换的格式,$1代表第一个括号匹配的值,$2代表第二个。上面的代码就是将URL结构导入sharexie/test.php中。把这些保存为.htaccess文件放在网站的根目录就行了。test.php<?phpecho '你的Action是:' . $_GET['action'];echo '<br/>';echo '你的ID是:' . $_GET['id'];?>好了,我们现在在浏览器中输入:127.0.0.1/view-12.html输出的是:你的Action是:view你的ID是:121、讲解一下RewriteRule:RewriteRule是重写规则,支持正则表达式的,上面的([0-9]{1,})是指由数字组成的,$是结束标志,说明是以数字结束!2、RewriteRule配置参数1) R 强制外部重定向2) F 禁用URL,返回403HTTP状态码。3) G 强制URL为GONE,返回410HTTP状态码。4) P 强制使用代理转发。5) L 表明当前规则是最后一条规则,停止分析以后规则的重写。6) N 重新从第一条规则开始运行重写过程。7) C 与下一条规则关联8) T=MIME-type(force MIME type) 强制MIME类型9) NS 只用于不是内部子请求10) NC 不区分大小写11) QSA 追加请求字符串12) NE 不在输出转义特殊字符 \%3d$1 等价于 =$1举例:1、将xianglc将定到 index.php?c=myuser&m=itime&domain=xianglcRewriteRule ^([a-zA-Z0-9]){6,20}/?$ index.php?c=myuser&m=itime&domain=$0 [L]2、#RewriteRule ^/index.html$ /1.php [L]RewriteRule ^/index-(.?)-(.?)-(.?)-(.?)-(.?)-(.?)-(.?)-(.?)-(.*?)$ $9&a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8 [C,NC]RewriteRule ^(.?)-(.?)-(.?)-(.?)-(.?)-(.?).html(.*?)$ /1.php?$7&i=$1&j=$2&k=$3&l=$4&m=$5&n=$6 [QSA,L,NC]Php内容:3.2 一个路由解析器,用来解析规则,匹配和转换URL。先将所有的链接转到index.php中,在index.php中进行路由分发,按照类和方法分配到相应的类文件中的函数上去。用$_SERVER['REQUEST_URI']取出URL中的www.xx.com/后面的部分,按照相关规则分别区分为class和mothod以及参数key=>value的值。最后include该类文件,执行其中的函数。实例如下:<?phperror_reporting(0);date_default_timezone_set("Asia/Shanghai");$_DocumentPath = $_SERVER['DOCUMENT_ROOT'];$_RequestUri = $_SERVER['REQUEST_URI'];$_UrlPath = $_RequestUri;$_FilePath = __FILE__;$_AppPath = str_replace($_DocumentPath, '', $_FilePath); //==>\router\index.php$_AppPathArr = explode(DIRECTORY_SEPARATOR, $_AppPath);for ($i = 0; $i < count($_AppPathArr); $i++) { $p = $_AppPathArr[$i]; if ($p) { $_UrlPath = preg_replace('/^\/'.$p.'\//', '/', $_UrlPath, 1); } }$_UrlPath = preg_replace('/^\//', '', $_UrlPath, 1); $_AppPathArr = explode("/", $_UrlPath); $_AppPathArr_Count = count($_AppPathArr); $arr_url = array( 'controller' => 'sharexie/test', 'method' => 'index', 'parms' => array()); $arr_url['controller'] = $_AppPathArr[0]; $arr_url['method'] = $_AppPathArr[1]; if ($_AppPathArr_Count > 2 and $_AppPathArr_Count % 2 != 0) { die('参数错误');} else { for ($i = 2; $i < $_AppPathArr_Count; $i += 2) { $arr_temp_hash = array(strtolower($_AppPathArr[$i])=>$_AppPathArr[$i + 1]); $arr_url['parms'] = array_merge($arr_url['parms'], $arr_temp_hash); }} $module_name = $arr_url['controller']; $module_file = $module_name.'.class.php'; $method_name = $arr_url['method']; if (file_exists($module_file)) { include $module_file; $obj_module = new $module_name(); if (!method_exists($obj_module, $method_name)) { die("要调用的方法不存在"); } else { if (is_callable(array($obj_module, $method_name))) { $obj_module -> $method_name($module_name, $arr_url['parms']); $obj_module -> printResult(); } }} else { die("定义的模块不存在");}?>参考文档:http://httpd.apache.org/docs/2.2/rewrite/http://www.cnblogs.com/xiangxiaodong/archive/2012/07/19/2600138.html用原生的php书写ci的路由功能:http://www.nowamagic.net/librarys/veda/detail/1938
2023年08月07日
11 阅读
0 评论
0 点赞