2010-01-20 15 views
22

के माध्यम से चल रहे PHP स्क्रिप्ट में काम नहीं करता है, मैं $ _SERVER ['DOCUMENT_ROOT'] का उपयोग करता हूं। "/ Lib/sft_required.php"; एक PHP स्क्रिप्ट में 'sft_required' फ़ाइल को शामिल करने के लिए। जब मैं ब्राउज़र का उपयोग करके इस फ़ाइल को चलाता हूं, तो यह ठीक काम करता है लेकिन जब मैं इसे क्रॉन जॉब जॉब के रूप में चलाता हूं, तो यह काम नहीं करता है। ऐसा लगता है कि जब हम क्रॉन के माध्यम से स्क्रिप्ट चलाते हैं तो फ़ाइल शामिल नहीं होती है।

उत्तर

23

मान लीजिए कि आप क्रॉन के माध्यम से सीधे स्क्रिप्ट चला रहे हैं (जैसा कि एक क्रोनबॉज द्वारा ट्रिगर किए गए HTTP अनुरोध से प्राप्त वेब सर्वर से होता है (उदाहरण के लिए क्रॉन रनिंग वॉज द्वारा), तो निश्चित रूप से यह काम नहीं करता है।

कोई सर्वर नहीं है, इसलिए $_SERVER सेट नहीं है।

+9

दरअसल '$ _SERVER' सुपरग्लोबल सेट है लेकिन इसमें अलग-अलग मान हैं। –

+1

"ज़ाहिर है"? सर्वर 'भूल' क्या होगा 'DOCUMENT_ROOT' क्या है? यह स्पष्ट नहीं है (वास्तव में, कुछ सालों बाद भी मुझे समझ में नहीं आता कि क्यों DOC_ROOT खाली है ('REMOTE_ADDR' आदि अधिक स्पष्ट हैं) – Martijn

+0

@Martijn - सर्वर कुछ भी नहीं भूल जाएगा। PHP द्वारा चलाया नहीं जा रहा है वेब सर्वर, यह क्रॉन द्वारा चलाया जा रहा है। – Quentin

7

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

58

आप पॉप्युलेट सकता है $ _SERVER पर [ 'DOCUMENT_ROOT'] अपनी खुद की

$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__); 

अगर क्रॉन फ़ाइल दस्तावेज़ जड़

$_SERVER['DOCUMENT_ROOT'] = dirname(dirname(__FILE__)); 

में है अगर क्रॉन फ़ाइल दस्तावेज़ के ऊपर एक निर्देशिका है रूट

+1

यह उत्तर स्वीकार्य के रूप में चिह्नित किया जाना चाहिए क्योंकि यह ओपी के प्रश्न का व्यावहारिक समाधान देता है ... –

4

मैंने एक समान प्रश्न here का उत्तर दिया। जैसा कि लोगों ने उल्लेख किया है, सुपरग्लोबल $ _SERVER को सीएलआई स्थितियों में परिभाषित नहीं किया गया है। लिंक में DOCUMENT_ROOT स्थान प्राप्त करने के लिए एक (अब तक) मूर्खतापूर्ण विधि है। उम्मीद है कि यह उपयोगी साबित होता है।

1
define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1)); 

यह आपको cronjobs के लिए $_SERVER['DOCUMENT_ROOT'] के समान डेटा प्राप्त करेगा।

+0

क्यों -1? यह काम करता है। – alimack

+0

बहुत सारे चीजें 'dirname' (__FILE __) 'और, हल न करें ... –

1

उदाहरण 1:
/var/www/site.com/ - DOCUMENT_ROOT;
/var/www/site.com/ क्रॉन /script.php - सीआरओएन PHP स्क्रिप्ट;

<?php 
/** DOCUMENT_ROOT -> /var/www/site.com/ */ 
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../'); 
?> 

उदाहरण 2:
/var/www/site.com/ - DOCUMENT_ROOT;
/var/www/site.com/ sub_dir/cron /script.php - सीआरओएन PHP स्क्रिप्ट;

<?php 
/** DOCUMENT_ROOT -> /var/www/site.com/ */ 
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../../'); 
?> 
संबंधित मुद्दे