代码之家  ›  专栏  ›  技术社区  ›  Jimmy

如何确定fastcgi是否用于运行php脚本

  •  14
  • Jimmy  · 技术社区  · 17 年前

    我有一个托管站点,在配置joomla时遇到问题(在iis7+win-server 2008上运行joomla+php+mysql)。我在一台本地机器上运行了类似的配置(iis7+vista x64上的joomla+php+mysql),所以我至少能够按照各种教程中关于如何设置它的说明进行操作。

    托管站点的这个症状是我不能在joomla中打开任何SEO设置(甚至不是第一个设置,“搜索引擎友好的URL”)。我要么得到404(找不到文件),要么URL被正确地重写,但它总是显示主页的内容。我在自己的主机上也遇到了类似的问题,结果是因为我没有使用fastcgi来托管PHP,所以我决定在托管站点上进行调查。

    总之,我注意到在托管站点上托管joomla的目录的web.config文件中有以下行:

    <add name="Plesk_Handler_3522909676" path="*.php" verb="*" modules="IsapiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php5isapi.dll" resourceType="Either" />
    

    根据过去的经验,我知道PHP在不在fastcgi下运行时有一些问题。我注意到根文件夹中的web.config使用了以下行:

    <add name="Plesk_Handler_0286090609" path="*.php" verb="*" modules="CgiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php-cgi.exe" resourceType="Either" /> 
    

    我把它复制到joomla目录的web.config中,得到了不同的行为…但仍然不起作用。如果我在运行phpinfo()的joomla目录中加载一个.php文件,在服务器api下它会显示cgi/fastcgi。是吗? 肯定的确认 正在使用FastCGI?为什么web配置中的处理程序指向modules=“cgimodule”而不是modules=“fastcgimodule”(我甚至不确定是否存在,但我发现cgimodule是可疑的)。

    这是一个托管站点,据我所知,我没有访问applicationhost.config文件的权限…

    8 回复  |  直到 7 年前
        1
  •  25
  •   Jimmy    14 年前

    下面是一个简单的测试:

    1. 使用创建phpinfo.php文件

     <?php phpinfo(); ?> 
    

    内部;

    1. 请求 http://yoursite.com/phpinfo.php/foobar?foo=bar

    2. 检查phpinfo的输出并查找_server[“request_uri”]。

    如果缺少此变量,则使用CGI。变量是否存在并正确设置为/phpinfo.php/foobar?foo=bar,然后使用isapi或fastcgi。查看服务器API输出的顶部;应该将其设置为is api(表示正在使用is api)或cgi/fastcgi(表示正在使用fastcgi,因为我们已经排除了cgi)。

        2
  •  3
  •   damarsan    12 年前

    您可以使用(在CentOS上)apachell-m,将显示哪些模块已启用:

    阿帕切特-米:

    文件缓存模块(共享) 内存缓存模块(共享) 版本\模块(共享) FastCGI U模块(共享)

        3
  •  2
  •   LPL user462990    14 年前

    不幸的是,支票 \_SERVER["REQUEST_URI"] 不适合我。使用 CGI FASTCGI ,始终显示 /phpinfo.php/foobar?foo=bar .

    也没有看到 Server API = CGI/FastCGI 它只告诉您编译后的PHP版本支持哪些接口,而不是所使用的接口。然而,我发现了另一种更可靠的方法。

    将名为 PHPopf.PHP 包含文本: <? php phpinfo(); ?>

    检查变量 \_ENV["REDIRECT_HANDLER"] :
    如果设置为 php5-fastcgi (或其他fastcgi-ish)请求很可能通过了 FASTCGI . 如果设置为 application/x-httpd-php (或者我假设不是以上所述),您正在使用 CGI .

    然而,一个可靠的方法是通过运行一个小测试。你需要 ab (Apache工作台)工具。
    无论有无CGI,都要从另一台机器上运行:

    ab -c 100 -n 1000 http://yourdomain.com/path/phpinfo.php
    

    检查线路 Time taken for tests: . 至少在我的设备上,通过1.3Mbps ADSL连接访问我的VP,FastCGI完全将其最大化,而使用CGI只能填满一半。

    希望这有帮助。

        4
  •  1
  •   cjmling    7 年前

    php_sapi_name()或php_sapi都可以工作。

    http://php.net/manual/en/function.php-sapi-name.php

    <?php
        if (php_sapi_name() != 'cgi-fcgi'){
            echo 'I knew fastcgi wasn\'t working.';
        }else{
            echo 'Holy crap, something worked for once.';
        }
    
        5
  •  0
  •   lubos hasko    17 年前

    Joomla创建了一个.htaccess文件,其中包含重写规则,以启用搜索引擎友好的URL。如果您使用的是Apache,则需要为包含Joomla安装的目录设置“allowoverride fileinfo”。如果您使用的是IIS,那么您将需要一个模块,如iismodrewrite。以下是操作说明:[ http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

        6
  •  0
  •   dbr    17 年前

    您应该看到它的引用自

    <?php
    phpinfo();
    ?>
    

    服务器api=cgi/fastcgi

        7
  •  0
  •   cameron    15 年前

    确保在fastcgi未运行时脚本完全失败的初始设置。然后你就会知道,当它工作时,fastcgi守护进程就是原因。

        8
  •  0
  •   tobius    13 年前

    这对我有用。

    /**
     * return phpinfo() results as an array
     *
     * @credit http://php.net/manual/en/function.phpinfo.php#106862
     * @param void
     * @return array
     */
    function phpinfo_array(){
        ob_start();
        phpinfo();
        $info_arr = array();
        $info_lines = explode("\n", strip_tags(ob_get_clean(), '<tr><td><h2>'));
        $cat = 'general';
        foreach($info_lines as $line){
            preg_match('/<h2>(.*)<\/h2>/', $line, $title) ? $cat = preg_replace('/\s+/', '_', strtolower(trim($title[1]))) : null;
            if(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){
                $subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1])));
                $info_arr[$cat][$subcat] = $val[2];
            } elseif(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){
                $subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1])));
                $info_arr[$cat][$subcat] = array('local' => $val[2], 'master' => $val[3]);
            }
        }
        return $info_arr;
    }
    
    
    // output proper response code
    $phpinfo = phpinfo_array();
    $configure = (@isset($phpinfo['general']['configure_command'])) ?: null;
    
    // properly account for FastCGI
    if ($configure && preg_match('/--enable-fastcgi/', $configure)){
        // fastcgi response
        header('Status: 403 Access is forbidden');
    } else {
        // http response
        header('HTTP/1.0 403 Access is forbidden');
    }