मैं Apache/2.2.11 (Win32) PHP/5.3.0
चला रहा हूं और मैंने अपने .htaccess फ़ाइल में निम्न किया है:
SetEnv FOO bar
अगर मैं PHP फ़ाइल में $_ENV
चर को मुद्रित करता हूं, तो मुझे एक खाली सरणी मिल जाती है। मेरा पर्यावरण चर क्यों नहीं दिखाई देता है? पहली जगह में यह खाली क्यों है?
मुझे अपना वैरिएबल मिला है, लेकिन यह $_SERVER
चर में दिखाई देता है और किसी कारण से यह दो बार प्रकट होता है, जैसे ऐसा क्यों है?
[REDIRECT_FOO] => bar [FOO] => bar
ऐसा प्रतीत होता है कि मैं getenv('FOO')
का उपयोग कर इसे प्राप्त कर सकता हूं, इसलिए मुझे इसका उपयोग करना चाहिए लेकिन मैं अभी भी इस बारे में थोड़ा उत्सुक हूं कि इसके कारण क्या होता है क्या यह एक विंडोज़ मुद्दा है? या क्या हो रहा है?
मुड़ता है कि यहां दो मुद्दे हैं:
1. $_ENV
केवल अगर $_ENV
इसे अनुमति देता है , जो इसे डिफ़ॉल्ट रूप से नहीं लगता है, कम से कम डिफ़ॉल्ट WAMP सर्वर स्थापना में नहीं है।
; This directive determines which super global arrays are registered when PHP ; starts up. If the register_globals directive is enabled, it also determines ; what order variables are populated into the global space. G,P,C,E & S are ; abbreviations for the following respective super globals: GET, POST, COOKIE, ; ENV and SERVER. There is a performance penalty paid for the registration of ; these arrays and because ENV is not as commonly used as the others, ENV is ; is not recommended on productions servers. You can still get access to ; the environment variables through getenv() should you need to. ; Default Value: "EGPCS" ; Development Value: "GPCS" ; Production Value: "GPCS"; ; http://php.net/variables-order variables_order = "GPCS"
जब मैं variables_order
वापस EGPCS
सेट करता EGPCS
, $_ENV
अब रिक्त नहीं है।
2. जब आप अपने .htaccess
में SetEnv
का उपयोग करते हैं, तो इसे $_SERVER
में समाप्त होता है, $_ENV
में नहीं , जो मुझे कहना होगा कि यह SetEnv
भ्रामक है जब इसे SetEnv
नाम दिया SetEnv
…
# .htaccess SetEnv ENV dev SetEnv BASE /ssl/ # php var_dump($_SERVER['ENV'], $_SERVER['BASE']); // string 'dev' (length=3) // string '/ssl/' (length=5)
3. getenv
फ़ंक्शन काम किया क्योंकि यह जाहिरा तौर पर दोनों $_ENV
और $_SERVER
$_ENV
इसके अतिरिक्त, ऐसा करने के लिए ऐसा असंवेदनशील लगता है, जो उपयोगी हो सकता है
var_dump(getenv('os'), getenv('env')); // string 'Windows_NT' (length=10) // string 'dev' (length=3)
$_ENV
वेरिएबल्स पर्यावरण से आयात किए जाते हैं जिसके तहत PHP चल रहा है, और आपके सेटअप के आधार पर (ओएस, आपका सर्वर, चाहे अपाचे मॉड्यूल या फास्टसीजीआई के तहत PHP चलाता है आदि), यह बहुत भिन्न हो सकता है
IIRC एक मानक अपाचे + mod_php विंडोज़ में स्थापित, $_ENV
में चर को बदलने का एकमात्र तरीका है विंडोज़ पर्यावरण चर को बदलने ( यह देखें)। Windows पर PHP एक्सटेंशन के साथ काम करते समय यह महत्वपूर्ण हो सकता है, क्योंकि उनमें से कुछ (जैसे: php_ldap
) केवल $_ENV
पर वातावरण वार्स के माध्यम से कॉन्फ़िगर करने $_ENV
।
REDIRECT_*
चर दिखाई देते हैं यदि आप RewriteRules का उपयोग कर रहे हैं मेरे सर्वर पर वे भी ऐसा ही दिखाई देते हैं। इसमें फास्टसीजीआई के तहत चलने के साथ कुछ हो सकता है और अगर suexec के साथ मिलाया जाता है, तो यह पूरी तरह से पर्यावरण वातावरण को साफ़ करने की संभावना है। उन्हें वापस लाने के लिए अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता हो सकती है, PassEnv
विशेष रूप से के रूप में क्यों getenv () तुम्हारे लिए काम करता है, मैं कोई सुराग नहीं है। लेकिन सभी घटनाएं आपके सर्वर और PHP कॉन्फ़िगरेशन के लिए विशिष्ट हैं। सर्वरफॉल्ट पर पूछें, उन्हें पता होना चाहिए