php路由实现
1. php路由怎么实现
你这抄个的袭话 index.php 得这么写
<?php
header('content-type:text/html;charset=utf-8');
$actio=$_GET['actio'];
$do=$_GET['do'];
include$actio.'/'.$do.'.php';
2. ThinkPHP的路由是如何实现的
首先,要确认你的web服务器有没有打开rewrite,然后在conf文件下配置,
'URL_ROUTER_ON'=> TRUE,//打开路由;
'URL_ROUTE_RULES'=>array(
//路由规则,用正则来匹配;
)
3. 如何实现THINKPHP路由,PHP伪静态
tp 的路由随便,url,pathinfo,rewirte 都可以。
我这里用apache举例:
1 开启rewirte : LoadMole rewrite_mole moles/mod_rewrite.so
2 网站根目录增加 .htaccess 文件,内容如下:
RewriteEngine on
RewriteBase /
RewriteRule ^local/show_(\d*).html index.php/local/show/id/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteRule ^(.*)$ index.php/$1 [L]
我这里的 local/show_(\d*).html index.php/local/show/id/$1 是根据当前tp的路由来写的
如果是url模式可写为 :
RewriteRule ^local/show_(\d*).html index.php?m=local&a=show&id=$1 [L]
测试:
localAction.class.php 内容为:
<?php
class localAction extends Action{
public function show(){
echo 'id is: ' .$_GET['id'];
}
}
?>
4. PHP中路由功能的原理和定义,有没有一个基本的例子
1 网络互连
把自己的网络同其它的网络互连起来,从网络中获取更多的信息和向网络发布自己
的消息,是网络互连的最主要的动力。网络的互连有多种方式,其中使用最多的是网桥
互连和路由器互连。
1.1 网桥互连的网络
网桥工作在OSI模型中的第二层,即链路层。完成数据帧(frame)的转发,主要目
的是在连接的网络间提供透明的通信。网桥的转发是依据数据帧中的源地址和目的地址
来判断一个帧是否应转发和转发到哪个端口。帧中的地址称为“MAC”地址或“硬件”
地址,一般就是网卡所带的地址。
5. 如何在PHP中实现URL路由
统一网站的入口,方便程序在应用环境初始变量方面的初始化工作,使网站更安全。
统一的入口会对URL进行解析,初始化环境神马的,然后分配不同的工作,有点像路由器。
这样可以美化URL,便于用户记忆,优化搜索引擎收录。
6. 我想尝试着写个小型PHP框架,现在卡在类自动加载和路由实现上了
类自动加载跟路由是框架最基础的特性
给你点自动加载的思路,首先现在写框架必须用上命名空间,框架内部的类文件夹根据命名空间命名方便自动加载
在入口文件引入自己写的Autoload.php 通过spl_autoload_register获得要加载的类名
spl_autoload_register(function($class_name){
Autoload::splAutoload($class_name);
});
asseek outeRouter
asseekFunc
asseek
outeRoute
appwwwdocsdocsController
asseekController
asseekView
如果你采用命名空间上面函数的$class_name是类似这样的字符串,只要你有当前项目的初始路径再根据这段字符串require相应的php文件应该不难,自动加载就搞定了。
路由就更简单了就是通过$_SERVER['REDIRECT_URL'] 或$_SERVER['REDIRECT_URI'] 获得用户访问的URL,根据自己的框架制定的规则从URL中取得控制器与控制器方法名称,判断controller的类是否存在,存在则实例化,再判断controller的method是否存在,存在则调用方法,方法里面加载视图等就是另外的事情了。
7. php怎样不使用框架的情况下本地模拟url路由,实现localhost/a/id/1这种的访问方式
要实现路由的话你依然需要框架中路由器的支持,因为服务器不能理解你路径的具体含义.所以你需要一个路由器来帮助服务器去处理特定的信息.
不想用现成的就自己写一个简单的,如下:
首先你需要在htdoc下放一个.htaccess来实现单文件入口:
<IfMolemod_rewrite.c>
RewriteEngineOn
RewriteRule^$index.php?_url=[QSA,PT,L]
RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteRule^(.*)$index.php?_url=$1[QSA,L]
</IfMole>
然后自己写路由咯, index.php
<?php
//这里添加你想要的路径
$route=array(
//(:num)表示匹配任何数字,(:any)表示任意字符
'a/id/(:num)'=>'TestController:idAction',
'a/any/(:any)'=>'TestController:anyAction',
'a/no' =>'TestController:noAction',
//这里是默认控制器,就是当你访问localhost的时候用
'_DEFAULT_'=>'IndexController:indexAction',
);
//简单的Router
classRouter
{
private$route;
publicfunction__construct(array$route)
{
$this->route=$route;
}
publicfunctionparse($url)
{
if(empty($url)){
list($controller,$action)=explode(':',$this->route['_DEFAULT_']);
returnarray(
'controller'=>$controller,
'action' =>$action,
'params' =>array(),
);
}
$trans=array(
':any'=>'[^/]+',
':num'=>'[0-9]+'
);
foreach($this->routeas$u=>$d){
$pattern='#^'.strtr($u,$trans).'$#';
if(preg_match($pattern,$url,$params)){
list($controller,$action)=explode(':',$d);
array_shift($params);
returnarray(
'controller'=>$controller,
'action' =>$action,
'params' =>$params,
);
}
}
header("HTTP/1.0404NotFound");
exit('Pagenotfound');
}
}
$r=newRouter($route);
$arr=$r->parse($_GET['_url']);
require($arr['controller'].'.php');
//执行控制器的功能
$dispatcher=new$arr['controller'];
call_user_func_array(array($dispatcher,$arr['action']),$arr['params']);
?>
控制器1. Testcontroller.php
<?php
classTestController
{
publicfunctionidAction($id)
{
echo"Yourint-onlyidis:{$id}";
}
publicfunctionanyAction($any_id)
{
echo"Youanyidis:{$any_id}";
}
publicfunctionnoAction()
{
echo"Thismethodtakenoparameter";
}
}
默认控制器: IndexController.php
<?php
classIndexController
{
publicfunctionindexAction()
{
echo"HelloWorld!";
}
}
把.htaccess, index.php, TestController.php, IndexController.php放在htdoc里就可以了
8. php怎么学会一个框架的路由机制
如果用过zend和symphony或者yii的可以去研究一下源码。
主要是通过伪静态来实现单一入口,mvc框架都是这样。将所有请求通过apache伪静态解析转给某个指定文件,然后通过php的$_SERVER[]这个全局变量来去的请求的路径字符串,对其进行解析再分配给指定的类去处理,基本就是这样。
最简单的方法是建立一个.htaccess文件。文件内容贴给你
<IfMole !mod_rewrite.c>
ErrorDocument 500 'mod_rewrite must be enabled'
</IfMole>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php
将这个文件放在根目录下即可。文件作用很明显:将所有的请求路径转给index.php,然后在index.php里做请求字符串的判断即可打到路由解析功能。