2009-12-28 20 views
40

यदि कोई PHP स्क्रिप्ट क्रॉन स्क्रिप्ट के रूप में चलाया जाता है, तो सापेक्ष पथों का उपयोग होने पर अक्सर विफल रहता है। उदाहरण के लिए, यदि आप जब कमांड लाइन पर चलते हैं, लेकिन एक क्रॉन स्क्रिप्ट से नहीं चला जबक्रॉन PHP स्क्रिप्ट में काम नहीं कर रहे सापेक्ष पथ

require_once('foo.php'); 

फ़ाइल foo.php मिल जाएगा है।

इसके लिए एक सामान्य कामकाज पहले काम करने वाली निर्देशिका में chdir है, या पूर्ण पथ का उपयोग करना है। मैं जानना चाहता हूं, हालांकि, इस व्यवहार के कारण क्रॉन और खोल के बीच क्या अंतर है। क्रॉन स्क्रिप्ट में सापेक्ष पथ का उपयोग करते समय यह विफल क्यों होता है?

+0

यह रूप में अच्छी तरह के लिए एक महान संसाधन है: http://stackoverflow.com/questions/2857712/सक्षम-उचित-सापेक्ष-पथ-इन-क्रॉन – Webnet

उत्तर

11

क्रॉन से चलने पर स्क्रिप्ट की कार्य निर्देशिका अलग हो सकती है। Additionaly, वहाँ कुछ भ्रम की स्थिति के बारे में PHPs की आवश्यकता होती है() था और शामिल हैं() है, जो के बारे में काम कर निर्देशिका वास्तव में समस्या जा रहा है भ्रम का कारण:

include('foo.php') // searches for foo.php in the same directory as the current script 
include('./foo.php') // searches for foo.php in the current working directory 
include('foo/bar.php') // searches for foo/bar.php, relative to the directory of the current script 
include('../bar.php') // searches for bar.php, in the parent directory of the current working directory 
1

जब एक क्रॉन नौकरी निष्पादित की जाती है तो आपकी PHP स्क्रिप्ट शायद अलग-अलग संदर्भ में चलती है, अगर आप इसे मैन्युअल रूप से खोल से शुरू करते हैं। तो आपके सापेक्ष पथ सही रास्ते पर इशारा नहीं कर रहे हैं।

+0

यह सही है। वास्तव में, स्क्रिप्ट की कार्यशील निर्देशिका खोल की कार्यशील निर्देशिका है। पूर्ण पथनाम का उपयोग करना चाहिए। – mauris

+1

पूर्ण पथ नाम प्रबंधित करने के लिए एक दुःस्वप्न हैं क्योंकि आप फ़ाइलों को चारों ओर ले जाते हैं ... बस 'dirname (__FILE__) ' – aequalsb

3

एक और संभावना यह है कि सीएलआई संस्करण एक अलग php.ini फ़ाइल का उपयोग कर रहा है। (डिफ़ॉल्ट रूप से, यह php-cli.ini और मानक php.ini पर फ़ॉलबैक का उपयोग करेगा)

इसके अलावा, यदि आप अपने पुस्तकालय पथ को सेट करने के लिए .htaccess फ़ाइलों का उपयोग कर रहे हैं, तो यह स्पष्ट रूप से काम नहीं करेगा क्ली के माध्यम से।

86

बदलें चल फ़ाइल पथ के लिए कार्यशील निर्देशिका। चल रहे फ़ाइल में बस

chdir(dirname(__FILE__)); 
include_once '../your_file_name.php'; //we can use relative path after changing directory 

का उपयोग करें। फिर आपको सभी संबंधित पथों को प्रत्येक पृष्ठ में पूर्ण पथ में बदलने की आवश्यकता नहीं होगी।

+1

का उपयोग करें यह मुझे पागल कर रहा था। इसने इसे पूरी तरह से – Andy

+1

को हल किया है इसे सही एक – axelbrz

+1

के रूप में चिह्नित किया जाना है, आप 'chdir (__ डीआईआर __) का भी उपयोग कर सकते हैं; जो थोड़ा और संक्षिप्त है। – billynoah

7

केवल मौका मैं एक ही समय में क्रॉन और अपाचे के साथ काम करने के लिए "require_once" मिल गया

require_once(dirname(__FILE__) . '/../setup.php'); 
0

DIR काम करता है, हालांकि यह मेरी स्थानीय होस्ट पर काम नहीं करेगा के रूप में यह मेरी लाइव की तुलना में एक अलग रास्ता है था साइट सर्वर। मैंने इसे ठीक करने के लिए इसका इस्तेमाल किया।

if(__DIR__ != '/home/absolute/path/to/current/directory'){ // path for your live server 
     require_once '/relative/path/to/file'; 
    }else{ 
     require_once '/absolute/path/to/file'; 
    } 
+1

अभी भी एक सशर्त कथन का उपयोग कर रहा है जिसे 'dirname (__FILE__) ' – aequalsb

3

क्योंकि क्रॉन नौकरियों के लिए "वर्तमान कार्यशील निर्देशिका" निर्देशिका जहाँ आपके crontab फ़ाइल मौजूद होगा - इसलिए किसी भी संबंधित पथ है कि निर्देशिका के सापेक्ष के साथ।

इसे संभालने का सबसे आसान तरीका dirname() फ़ंक्शन और PHP __FILE__ स्थिर है। अन्यथा, जब भी आप फ़ाइल को किसी भिन्न निर्देशिका या किसी भिन्न फ़ाइल संरचना वाले सर्वर पर ले जाते हैं, तो आपको फ़ाइल को नए पूर्ण पथों से संपादित करने की आवश्यकता होगी।

dirname(__FILE__) 

__FILE__ एक निरंतर फ़ाइल जिसमें से यह कहा जाता है का पूरा पथ के रूप में पीएचपी द्वारा परिभाषित किया गया है। भले ही फ़ाइल शामिल है, __FILE__ हमेशा फ़ाइल के पूर्ण पथ को संदर्भित करेगा - फाइल सहित।

तो dirname(__FILE__) फ़ाइल युक्त निर्देशिका में पूर्ण निर्देशिका पथ देता है - इससे कोई फर्क नहीं पड़ता कि यह कहां से शामिल है और basename(__FILE__) फ़ाइल नाम स्वयं लौटाता है।

उदाहरण: के "/home/user/public_html/index.php" भी शामिल है "/home/user/public_html/your_directory/your_php_file.php" नाटक करते हैं।

यदि आप "your_php_file.php" में dirname(__FILE__) पर कॉल करते हैं तो आपको "/ home/user/public_html/your_directory" मिल जाएगा, भले ही सक्रिय स्क्रिप्ट "/ home/user/public_html" में हो (पीछे की अनुपस्थिति को नोट करें स्लैश)।

आप सहित फ़ाइल उपयोग की निर्देशिका की जरूरत है: dirname($_SERVER['PHP_SELF']) जो "/ घर/उपयोगकर्ता/public_html" लौट सकते हैं और एक ही है जाएगा "index.php" फ़ाइल में dirname(__FILE__) बुला के बाद से संबंधित पथ ही कर रहे हैं के रूप में।

उदाहरण उपयोगों:

@include dirname(__FILE__) . '/your_include_directory/your_include_file.php'; 

@require dirname(__FILE__) . '/../your_include_directory/your_include_file.php'; 
2

स्वीकार किए जाते हैं जवाब उपरोक्त के अतिरिक्त, आप भी उपयोग कर सकते हैं:

chdir(__DIR__); 
+0

द्वारा प्रतिस्थापित किया जा सकता है, यदि आपको – aequalsb

+0

में पर्यावरण में' chdir() 'निष्पादित करने की अनुमति है तो यह आम है? मैंने कभी भी किसी भी पर्यावरण में काम नहीं किया है जहां उस समारोह की अनुमति नहीं थी। – billynoah

+0

मैंने इसे PHP safe_mode से संबंधित अनुभव किया है। http://php.net/manual/en/features.safe-mode.functions.php, लेकिन इसे http://php.net/manual/en/features.safe-mode.php को बहिष्कृत कर दिया गया है। - इसे हटाया नहीं गया है ... मतलब है, यह अभी भी सामना किया जा सकता है। – aequalsb

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