2009-03-04 39 views
13

我有一個託管網站,並且在配置Joomla時遇到問題(在IIS7 + win server 2008上運行Joomla + php + mySQL)。我有一個類似的配置在本地機器上運行(在IIS7 + vista x64上的Joomla + php + mySQL),所以我至少能夠遵循各種教程中關於如何設置的說明。如何知道FastCGI是否被用來運行PHP腳本

託管網站的這種症狀是,我無法打開Joomla中的任何搜索引擎優化設置(甚至沒有第一個設置,「搜索引擎友好網址」)。我得到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文件...

回答

24

這裏有一個簡單的測試:

  1. 創建

<?php phpinfo(); ?> 

內phpinfo.php的文件;

  • 請求http://yoursite.com/phpinfo.php/foobar?foo=bar

  • 檢查的phpinfo的輸出,並尋找_SERVER [ 「REQUEST_URI」]。

  • 如果缺少該變量,則使用CGI。如果該變量存在並正確設置爲/phpinfo.php/foobar?foo=bar,則使用ISAPI或FastCGI。查看Server API輸出的頂部附近;它應該設置爲ISAPI(意味着使用ISAPI)或CGI/FastCGI(這意味着正在使用FastCGI,因爲我們已經排除了CGI)。

    +1

    $ _ SERVER [ 'REQUEST_URI']服務器API = CGI/FastCGI的可以在這兩個CGI和FastCGI和服務器API可能會顯示這兩個CGI和FastCGI 'CGI/FastCGI的' 正確顯示。 一個區別是在FastCGI $ _SERVER [「REDIRECT_HANDLER」]可能會顯示php-fastcgi,但也不能證實正在使用「FastCGI」,因爲「php-fastcgi」只是配置文件中使用的變量名。 – 2011-12-08 06:30:27

    +0

    @Jimmy,這個答案非常[需要引文](http://xkcd.com/285)。此外,您描述的方法聽起來有點* hacky *,是否有更好更強大的方式直接確定設置? – Pacerier 2015-06-24 10:25:00

    +0

    @Pacerier它爲我工作,顯然對許多其他人。我找不到更好的方法,但如果您有答案,請隨時發佈「更好,更強大」的答案。我自己想出了它,因此沒有引用。 – Jimmy 2015-06-24 14:20:54

    0

    您應該看到

    <?php 
    phpinfo(); 
    ?> 
    

    服務器API引用它= CGI/FastCGI

    +0

    但是是肯定的?我的主機說他們不支持FastCGI;上面的web.config表示他們正在使用CGI,而不是FastCGI;然而,我仍然看到在phpinfo()函數 – Jimmy 2009-03-04 15:05:07

    0

    Joomla創建一個帶有重寫規則的.htaccess文件來啓用搜索引擎友好的URL。如果您使用的是Apache,則需要爲包含joomla安裝的目錄設置「AllowOverride FileInfo」。如果您使用IIS,則需要一個模塊,如IISModRewrite。下面是此指令:http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

    2

    不幸的是,檢查\_SERVER["REQUEST_URI"]並沒有爲我工作。使用CGIFastCGI的,它總是顯示/phpinfo.php/foobar?foo=bar

    沒有看到是否設置了Server API = CGI/FastCGI - 它只告訴你php編譯版本支持哪些接口,而不是使用什麼接口。但是,我發現了另一種更可靠的方法。

    plonk的到位一個名爲phpinfo.php的文本:如果設置爲php5-fastcgi(或別的東西的FastCGI-ISH)的要求很可能
    <? php phpinfo(); ?>

    檢查變量\_ENV["REDIRECT_HANDLER"]通過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只能填充一半。

    希望這會有所幫助。

    0

    確保在fastcgi未運行時,將腳本初始設置爲腳本完全失敗的位置。然後你會知道,當它工作時,fastcgi守護進程就是原因。

    0

    這對我有效。

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

    您可以使用(在CentOS)的apachectl -M,你會顯示模塊啓用的:

    的apachectl -M:

    file_cache_module(共享) mem_cache_module(共享) version_module (共享) fastcgi_module(共享)

    相關問題