【问题标题】:How to know for sure if FastCGI is being used to run php scripts如何确定 FastCGI 是否用于运行 php 脚本
【发布时间】:2009-03-04 02:25:47
【问题描述】:

我有一个托管站点,但在配置 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 文件,则在 Server API 下它会显示 CGI/FastCGI 。是否肯定确认正在使用 FastCGI?为什么 web 配置中的处理程序指向 modules="CgiModule" 而不是 modules="FastCgiModule" (我什至不确定是否存在,但我只是发现提到 CgiModule 很可疑)。

这是一个托管站点,据我所知,我无权访问 ApplicationHost.config 文件...

【问题讨论】:

    标签: php iis iis-7 fastcgi


    【解决方案1】:

    这是一个简单的测试:

    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 的输出顶部附近;它应该设置为 ISAPI(表示正在使用 ISAPI)或 CGI/FastCGI(表示正在使用 FastCGI,因为我们已经排除了 CGI)。

    【讨论】:

    • $_SERVER['REQUEST_URI'] 可能会在 CGI 和 FastCGI 中正确显示,并且服务器 API 可能会为 CGI 和 FastCGI 显示“CGI/FastCGI”。一个区别是,在 FastCGI $_SERVER["REDIRECT_HANDLER"] 中可能会显示 php-fastcgi ,但这也不能确认正在使用“FastCGI”,因为“php-fastcgi”只是配置文件中使用的变量名。
    • @Jimmy,这个答案在need for citations 中非常重要。另外,你描述的方法听起来有点hacky,有没有更好更健壮的方法来直接确定设置?
    • @Pacerier 它对我有用,显然也对许多其他人有用。我找不到更好的方法,但如果你有一个“更好和更强大”的答案,请随时发布。我自己想出了它,因此没有引用。
    • @Jimmy,问题是“如何确定是否使用 FastCGI 运行 php 脚本”,这意味着此页面上的人无法验证您的答案是否确实有效如前所述。因此我说需要引用。一旦答案达到 +8 票,其他人就会不假思索地投票,也不会真正尝试。另见stackoverflow.com/a/1181327/632951
    【解决方案2】:

    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.';
        }
    

    【讨论】:

    • 感谢 Gregor,这似乎是一个非常简单的解决方案。
    【解决方案3】:

    您可以使用(在 centos 上)apachectl -M,您将显示启用了哪些模块:

    apachectl -M:
    
    file_cache_module (shared)
    mem_cache_module (shared)
    version_module (shared)
    fastcgi_module (shared)
    

    【讨论】:

    • 也可以在 Ubuntu 上运行,虽然我必须使用 sudo
    【解决方案4】:

    不幸的是,检查\_SERVER["REQUEST_URI"] 对我不起作用。使用 CGIFastCGI,它总是显示 /phpinfo.php/foobar?foo=bar

    也没有看到是否设置了Server API = CGI/FastCGI - 这只会告诉您编译后的 php 版本支持哪些接口,而不是正在使用什么接口。但是,我发现了另一种可能更可靠的方法。

    插入一个名为 phpinfo.php 的文件,其中包含以下文本:&lt;? php phpinfo(); ?&gt;

    检查变量\_ENV["REDIRECT_HANDLER"]:
    如果它设置为php5-fastcgi(或其他fastcgi-ish),请求很可能通过FastCGI。如果它设置为application/x-httpd-php(或者我假设不是上述情况),那么您使用的是CGI

    但是,一个可靠的方法是运行一个小测试。为此,您需要 ab (Apache Bench) 工具。
    无论有没有 CGI,都可以在另一台机器上运行:

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

    检查Time taken for tests: 行。至少在我的机器上,通过 1.3Mbps ADSL 连接访问我的 VPS,FastCGI 将其完全最大化,而使用 CGI 只能填充一半。

    希望这会有所帮助。

    【讨论】:

      【解决方案5】:

      你应该看到从

      引用它
      <?php
      phpinfo();
      ?>
      

      服务器 API = CGI/FastCGI

      【讨论】:

      • 但这是肯定的吗?我的主人说他们不支持 FastCGI;上面的 web.config 说他们使用的是 CGI,而不是 FastCGI;然而,我仍然在 phpinfo() 中看到 Server API = CGI/FastCGI
      【解决方案6】:

      Joomla 创建一个包含重写规则的 .htaccess 文件,以启用搜索引擎友好的 URL。如果您使用的是 Apache,则需要为包含您的 joomla 安装的目录设置“AllowOverride FileInfo”。如果您使用的是 IIS,您将需要一个模块,例如 IISModRewrite。以下是相关说明:[http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          这对我有用。

          /**
           * 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');
          }
          

          【讨论】:

          • 脚本的工作原理和脚本的作用是什么?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-10
          • 1970-01-01
          • 1970-01-01
          • 2012-04-08
          • 2011-09-15
          • 1970-01-01
          • 2016-11-13
          相关资源
          最近更新 更多