wordpress /wp-load.php下的wp_fix_server_vars()函数解读

来源:互联网 发布:下手机电视直播软件 编辑:程序博客网 时间:2024/06/05 18:09
function wp_fix_server_vars() {    global $PHP_SELF;    $default_server_values = array(        'SERVER_SOFTWARE' => '',        'REQUEST_URI' => '',    );    $_SERVER = array_merge( $default_server_values, $_SERVER );    // Fix for IIS when running with PHP ISAPI    if ( empty( $_SERVER['REQUEST_URI'] ) || ( PHP_SAPI != 'cgi-fcgi' && preg_match( '/^Microsoft-IIS\//', $_SERVER['SERVER_SOFTWARE'] ) ) ) {        // IIS Mod-Rewrite        if ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {            $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];        }        // IIS Isapi_Rewrite        elseif ( isset( $_SERVER['HTTP_X_REWRITE_URL'] ) ) {            $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];        } else {            // Use ORIG_PATH_INFO if there is no PATH_INFO            if ( !isset( $_SERVER['PATH_INFO'] ) && isset( $_SERVER['ORIG_PATH_INFO'] ) )                $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];            // Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)            if ( isset( $_SERVER['PATH_INFO'] ) ) {                if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] )                    $_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];                else                    $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO'];            }            // Append the query string if it exists and isn't null            if ( ! empty( $_SERVER['QUERY_STRING'] ) ) {                $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];            }        }    }    //*使用PHP写CGI的主机    // Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests    if ( isset( $_SERVER['SCRIPT_FILENAME'] ) && ( strpos( $_SERVER['SCRIPT_FILENAME'], 'php.cgi' ) == strlen( $_SERVER['SCRIPT_FILENAME'] ) - 7 ) )        $_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED'];    // Fix for Dreamhost and other PHP as CGI hosts    if ( strpos( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) !== false )        unset( $_SERVER['PATH_INFO'] );    // Fix empty PHP_SELF    $PHP_SELF = $_SERVER['PHP_SELF'];    if ( empty( $PHP_SELF ) )        $_SERVER['PHP_SELF'] = $PHP_SELF = preg_replace( '/(\?.*)?$/', '', $_SERVER["REQUEST_URI"] );}

1.CGI、SAPI、FastCGI的认识。
1、CGI(通用网关接口/Common Gateway Interface)一般是可执行程序,例如EXE文件,和WEB服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求。这样,当用 户请求数量非常多时,会大量占用系统的资源,如内存、CPU时间等,造成效能低下。
2、ISAPI(Internet Server Application Program Interface)是微软提供的一套面向WEB服务的API接口,它能实现CGI提供的全部功能,并在此基础上进行了扩展,如提供了过滤器应用程序接 口。ISAPI应用大多数以DLL动态库的形式使用,可以在被用户请求后执行,,在处理完一个用户请求后不会马上消失,而是继续驻留在内存中等待处理别的 用户输入。此外,ISAPI的DLL应用程序和WEB服务器处于同一个进程中,效率要显著高于CGI。
3、FastCGI是可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。传统的CGI解释器的反复加载是 CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性等。

2.PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别
SERVER[PHPSELF]_SERVER[SCRIPT_NAME], $_SERVER[‘REQUEST_URI’] 在用法上是非常相似的,他们返回的都是与当前正在使用的页面地址有关的信息,这里列出一些相关的例子,帮助确定哪些是在你的脚本最适合的。

$_SERVER[’PHP_SELF’]

http://www.yoursite.com/example/ — – — /example/index.php
http://www.yoursite.com/example/index.php — – — /example/index.php
http://www.yoursite.com/example/index.php?a=test — – — /example/index.php
http://www.yoursite.com/example/index.php/dir/test — – — /dir/test
当我们使用SERVER[PHPSELF]访URLindex.phpindex.php.线_SERVER[‘PHP_SELF’]。

$_SERVER[‘REQUEST_URI’]

http://www.yoursite.com/example/ — – — /
http://www.yoursite.com/example/index.php — – — /example/index.php
http://www.yoursite.com/example/index.php?a=test — – — /example/index.php?a=test
http://www.yoursite.com/example/index.php/dir/test — – — /example/index.php/dir/test
$_SERVER[‘REQUEST_URI’]返回的是我们在URL里写的精确的地址,如果URL只写到”/”,就返回 “/”

$_SERVER[‘SCRIPT_NAME’]

http://www.yoursite.com/example/ — – — /example/index.php
http://www.yoursite.com/example/index.php — – — /example/index.php
http://www.yoursite.com/example/index.php — – — /example/index.php
http://www.yoursite.com/example/index.php/dir/test — – — /example/index.php
在所有的返回中都是当前的文件名/example/index.php

0 0
原创粉丝点击