1, $_SERVER['SCRIPT_FILENAME'] 和 常量 __FILE__的区别(一般情况下两者的显示相同,都是显示文件的绝对路径,包括文件名,显示的起点是 电脑根目录 /)
①,如果在网站根目录下/var/www/创建一个软连接linkkk指向其他的文件夹~/work/test/,在linkkk下面建立a.php,打印$_SERVER,则这两者的显示就会有区别。
SCRIPT_NAME的显示以网站根目录为准,不忽略软连接,显示结果为:'SCRIPT_FILENAME' =>string '/var/www/linkkk/a.php' (length=21)
__FILE__的显示以服务器(即某台电脑)为准,忽略软连接,显示结果为:string '/home/ths/work/test/a.php' (length=34)
②,在include 或者require包含时,两者有区别。如b.php中包含a.php,在a.php中打印$_SERVER和__FILE__,然后访问b.php,则
SCRIPT_NAME显示的是b.php所在的路径,即受到了包含文件的影响,而__FILE__显示的是a.php所在路径。
总结一下:__FILE__显示的永远是 此文件相对于服务器的绝对路径(包含文件名),而且不受包含文件的影响!!
而$_SERVER['SCRIPT_FILENAME']受到包含文件的影响,而且显示以网站根目录为准!
2, 关于$_SERVER['PATH_INFO']
参考文章: http://www.111cn.net/phper/php-cy/62832.htm。
https://blogs.msdn.microsoft.com/david.wang/2005/08/05/what-is-path_translated/
http://blog.csdn.net/bingqingsuimeng/article/details/20380329
【自己测试】:只有在php文件后面加上/xxx/xxx才会打印出path_info信息,具体什么用,不太清楚。一个可能的用途是代替查询字符串?m=xxx&p=3,这样的查询网址显得不美观
如网址是如下时:http://localhost/trash/c.php/ddd/dddddd?aa=3/a/aa,打印结果是 'PATH_INFO' =>string '/ddd/dddddd' (length=11)
3,'REQUEST_URI' 和 'SCRIPT_NAME' 和 'PHP_SELF' [这三者都受包含文件的影响,显示的起点是网站根目录]
PHP $_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI'] 之间的区别
$_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI'] 三者非常相似,返回的都是与当前 URL 或 PHP 程序文件相关的信息:
- $_SERVER['PHP_SELF']:相对于网站根目录的路径及 PHP 程序名称。
- $_SERVER['SCRIPT_NAME']:相对于网站根目录的路径及 PHP 程序文件名称。
- $_SERVER['REQUEST_URI']:访问此页面所需的 URI 。
一个简单的例子可以看出它们的区别。URL 地址如下:
http://www.5idev.com/php/index.php/test/foo?username=hbolive
- $_SERVER['PHP_SELF'] 得到:/php/index.php/test/foo
- $_SERVER['SCRIPT_NAME'] 得到:/php/index.php
- $_SERVER['REQUEST_URI'] 得到:/php/index.php/test/foo?username=hbolive
从该例子可以看出:
- $_SERVER['PHP_SELF'] 则反映的是 PHP 程序本身;
- $_SERVER['SCRIPT_NAME'] 反映的是程序文件本身(这在页面需要指向自己时非常有用);
- $_SERVER['REQUEST_URI'] 则反映了完整 URL 地址(不包括主机名)。
其实从各自的命名上,也可以体现出它们之间的细微差别。
特别的,对于如下地址:
http://www.5idev.com/
- $_SERVER['PHP_SELF'] 得到:/index.php
- $_SERVER['SCRIPT_NAME'] 得到:/index.php
- $_SERVER['REQUEST_URI'] 得到:/
至于有人提到 $_SERVER['PHP_SELF'] 与 $_SERVER['SCRIPT_NAME'] 在 PHP 以 CGI 模式运行下会有区别。由于 PHP 在 CGI 模式运行下并不多见,测试较为麻烦,在此就不再叙述了。如有这种情况,可注意并自行测试。
希望在理解了它们之间的区别之后,以便选择更适合自己程序的来使用。