2009-03-04 22 views
13

मेरे पास एक होस्टेड साइट है और मुझे जूमला को कॉन्फ़िगर करने में समस्या हो रही है (IIS7 + Win Server 2008 पर जूमला + php + mySQL चला रहा है)। मेरे पास एक स्थानीय मशीन (जूमला + php + mySQL पर आईआईएस 7 + विस्टा x64) पर चल रही एक समान विन्यास है, इसलिए मैं इसे सेट अप करने के तरीके पर विभिन्न ट्यूटोरियल्स में दिखाए गए निर्देशों का पालन करने में कम से कम सक्षम था।यह सुनिश्चित करने के लिए कैसे करें कि फास्टसीजीआई का उपयोग php स्क्रिप्ट चलाने के लिए किया जा रहा है

होस्टेड साइट के साथ यह लक्षण यह है कि मैं जूमला में किसी भी एसईओ सेटिंग्स को चालू नहीं कर सकता (यहां तक ​​कि पहली सेटिंग, "खोज इंजन अनुकूल यूआरएल" भी नहीं)। मुझे या तो 404 (फ़ाइल नहीं मिली) या यूआरएल सही ढंग से फिर से लिखा जाता है लेकिन यह हमेशा होम पेज की सामग्री प्रदर्शित होता है। मेरे घर की मशीन पर मुझे एक ही समस्या थी और ऐसा लगता है क्योंकि मैं php होस्ट करने के लिए फास्टसीजीआई का उपयोग नहीं कर रहा था, इसलिए मैंने होस्टेड साइट पर इसकी जांच करने का फैसला किया।

वैसे भी, मैं निर्देशिका की मेजबानी की साइट पर जूमला होस्टिंग निम्नलिखित पंक्ति का 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" /> 

मैं की नकल की है कि जूमला निर्देशिका में web.config, और में अलग व्यवहार मिला ... लेकिन अभी भी काम नहीं कर रहा। अगर मैं joomla निर्देशिका में एक .php फ़ाइल लोड करता हूं जो phpInfo() चलाता है, सर्वर एपीआई के तहत यह CGI/FastCGI कहता है। क्या सकारात्मक पुष्टि है कि फास्टसीजीआई का उपयोग किया जा रहा है? वेब कॉन्फ़िगरेशन में हैंडलर मॉड्यूल = "फास्टसीजी मॉड्यूल" के बजाय मॉड्यूल = "CgiModule" को इंगित करता है (मुझे यह भी यकीन नहीं है कि मौजूद है, लेकिन मुझे बस CgiModule संदिग्ध का उल्लेख मिलता है)।

यह होस्ट की गई साइट है, ताकि तक मुझे पता है मैं ApplicationHost.config फ़ाइल के लिए उपयोग नहीं है ...

उत्तर

24

यहाँ एक साधारण परीक्षण है:

<?php phpinfo(); ?> 

अंदर के साथ एक phpinfo.php फ़ाइल बनाएँ;

  1. अनुरोध http://yoursite.com/phpinfo.php/foobar?foo=bar

  2. phpinfo के उत्पादन की जाँच करें और _SERVER [ "REQUEST_URI"] के लिए लग रही है।

यदि यह चर गुम है, तो CGI का उपयोग किया जाता है।यदि चर मौजूद है और सही ढंग से /phpinfo.php/foobar?foo=bar पर सेट है, तो या तो ISAPI या FastCGI का उपयोग किया जाता है। सर्वर एपीआई के आउटपुट के शीर्ष के पास देखो; इसे या तो आईएसएपीआई (जिसका अर्थ है आईएसएपीआई का उपयोग किया जा रहा है) या सीजीआई/फास्टसीजीआई (जिसका अर्थ है फास्टसीजीआई का उपयोग किया जा रहा है, क्योंकि हमने पहले ही सीजीआई से इंकार कर दिया है) पर सेट किया जाना चाहिए।

+1

$ _SERVER ['REQUEST_URI'] में सर्वर एपीआई = CGI/FastCGI को सीजीआई और फास्टसीजीआई दोनों में सही ढंग से दिखा सकता है और सर्वर एपीआई सीजीआई और फास्टसीजीआई दोनों के लिए 'सीजीआई/फास्टसीजीआई' दिखा सकता है। एक अंतर यह है कि फास्टसीजीआई $ _SERVER ["REDIRECT_HANDLER"] में php-fastcgi दिखा सकता है, लेकिन यह भी पुष्टि नहीं करता है कि "फास्टसीजीआई" का उपयोग किया जा रहा है क्योंकि "php-fastcgi" केवल एक चर नाम है जो कॉन्फ़िगरेशन फ़ाइल में उपयोग किया जाता है । –

+0

@ जिमी, यह उत्तर बहुत अधिक है [उद्धरणों की आवश्यकता] (http://xkcd.com/285)। साथ ही, आपके द्वारा वर्णित विधि थोड़ा * हैकी * लगता है, क्या सेटिंग्स को निर्धारित करने के लिए एक बेहतर और अधिक मजबूत तरीका है? – Pacerier

+0

@Pacerier यह मेरे लिए और स्पष्ट रूप से कई अन्य लोगों के लिए काम किया। मुझे एक बेहतर तरीका नहीं मिला, लेकिन यदि आपके पास एक "बेहतर और अधिक मजबूत" उत्तर पोस्ट करने के लिए स्वतंत्र महसूस हो रहा है। मैं इसके साथ आया, इसलिए कोई उद्धरण नहीं। – Jimmy

0

आप

<?php 
phpinfo(); 
?> 

सर्वर API से यह करने के लिए संदर्भित देखना चाहिए = सीजीआई/फास्टसीजीआई

+0

लेकिन यकीन है कि के लिए है? मेरा मेजबान कहता है कि वे फास्टसीजीआई का समर्थन नहीं करते हैं; उपरोक्त web.config का कहना है कि वे CGI का उपयोग कर रहे हैं, फास्टसीजीआई नहीं; और फिर भी, मैं अभी भी phpinfo() – Jimmy

0

जूमला खोज इंजन अनुकूल यूआरएल को सक्षम करने के लिए इसमें पुनः लिखने के नियमों के साथ एक .htaccess फ़ाइल बनाता है। यदि आप अपाचे का उपयोग कर रहे हैं तो आपको अपनी जूमला इंस्टॉलेशन वाली निर्देशिका के लिए "AllowOverride FileInfo" सेट करना होगा। यदि आप आईआईएस का उपयोग कर रहे हैं तो आपको IISModRewrite जैसे मॉड्यूल की आवश्यकता होगी। यहाँ इस के लिए निर्देश दिए गए हैं: [http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

2

दुर्भाग्य से, चेकिंग \_SERVER["REQUEST_URI"] मेरे लिए काम नहीं किया। CGI या फास्टसीजीआई का उपयोग करके, यह हमेशा /phpinfo.php/foobar?foo=bar प्रदर्शित करता है।

न तो देख रहा था कि Server API = CGI/FastCGI सेट किया गया था - जो केवल आपको बताता है कि PHP का संकलित संस्करण क्या इंटरफेस करता है, इसका उपयोग नहीं किया जा रहा है। हालांकि, मुझे एक और तरीका मिला जो अधिक भरोसेमंद काम कर सकता है।

Plonk स्थान पर एक फ़ाइल phpinfo.php बुलाया पाठ वाले: यह php5-fastcgi (या कुछ और FastCGI-ish) अनुरोध करने के लिए संभवत: सेट है, तो
: चर \_ENV["REDIRECT_HANDLER"] के लिए <? php phpinfo(); ?>

चेक फास्टसीजीआई के माध्यम से चला गया। यदि यह application/x-httpd-php पर सेट है (या मैं उपरोक्त के अलावा कुछ और मानता हूं), तो आप CGI का उपयोग कर रहे हैं।

हालांकि, एक निश्चित तरीका एक छोटे से परीक्षण चल रहा है। इसके लिए आपको ab (अपाचे बेंच) टूल की आवश्यकता है।
दोनों के साथ और सीजीआई बिना, किसी अन्य मशीन से इस चलाएँ:

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

लाइन Time taken for tests: की जाँच करें। कम से कम मेरे बॉक्स पर, 1.3 एमबीपीएस एडीएसएल कनेक्शन पर मेरे वीपीएस तक पहुंचने के बाद, फास्टसीजीआई ने इसे पूरी तरह से अधिकतम कर दिया, जबकि सीजीआई केवल आधा भरने में सक्षम था।

उम्मीद है कि इससे मदद मिलती है।

0

सुनिश्चित करें कि प्रारंभिक रूप से चीजें सेट की गई हैं जहां स्क्रिप्ट पूरी तरह विफल हो जाती है जब fastcgi नहीं चल रहा है। फिर आपको पता चलेगा, जब यह काम करता है, तो fastcgi daemon कारण है।

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'); 
} 
+1

स्क्रिप्ट कैसे काम करती है और स्क्रिप्ट क्या करती है? – Pacerier

3

आप (centos पर) apachectl -M उपयोग कर सकते हैं, तुम्हें दिखाता हूँ मॉड्यूल क्या सक्षम हैं:

apachectl -M:

file_cache_module (साझा) mem_cache_module (साझा) version_module (साझा) fastcgi_module (साझा)

+0

उबंटू पर भी काम करता है, हालांकि मुझे सूडो – Sam

1

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

का उपयोग करना पड़ा था, बच नहीं गया था, कृपया कोड संपादित करें। – Adrian

संबंधित मुद्दे