2010-07-11 8 views
39

स्थानीयहोस्ट पर। मैं निम्नलिखित निर्देशिका संरचना है:आप अच्छी तरह से काम करने के लिए PHP, Symlinks और __FILE__ कैसे प्राप्त करते हैं?

/share/www/trunk/wp-content/plugins/otherfolders

/share/www/portfolio/wp-content/symlink

कहाँ symlink/trunk/.../plugins/ के लिए एक प्रतीकात्मक कड़ी है। असल में, ऐसा इसलिए है क्योंकि मुझे एकाधिक वर्डप्रेस इंस्टॉलेशन का परीक्षण करने और उन्हें सेट अप करने की आवश्यकता है, लेकिन मैं प्लगइन को चारों ओर स्थानांतरित नहीं करना चाहता हूं और उन्हें कॉपी और पेस्ट करना चाहता हूं।

लेकिन, कभी कभी मैं एक कॉन्फ़िग फ़ाइल शामिल करने के लिए निर्देशिका वृक्ष ऊपर क्रॉल करने के लिए की जरूरत है:

$root = dirname(dirname(dirname(dirname(__FILE__)))); 
     if (file_exists($root.'/wp-load.php')) { 
      // WP 2.6 
      require_once($root.'/wp-load.php'); 
     } 

फ़ोल्डर हमेशा के लिए हल करता है:

/share/www/trunk

यहां तक ​​कि जब प्लगइन निष्पादित किया जा रहा है और

/share/www/portfolio/ में शामिल किया गया।

क्या PHP में share/www/portfolio निर्देशिका में /share/www/trunk/.../plugins निर्देशिका में सिम्लिंक में निष्पादित स्क्रिप्ट से फ़ाइलों को शामिल करना संभव है?

हालांकि यह समस्या केवल मेरे परीक्षण सर्वर पर होती है, मैं एक सुरक्षित वितरण योग्य समाधान रखना चाहता हूं, इसलिए अतिरिक्त स्तर को क्रॉल करना एक विकल्प नहीं है

+0

क्या आप जानते हैं कि जहां स्क्रिप्ट जहां __FILE__ व्यापार कर रहे हैं प्रवेश बिंदु के सापेक्ष है की कोशिश कर सकते हैं? आपके उदाहरण के संदर्भ में $ _SERVER ['SCRIPT_FILENAME'] क्या समान है? – Shabbyrobe

+0

बिंगो। मुझे पता है कि मुझे कितनी निर्देशिकाएं क्रॉल करने की ज़रूरत है। मुझे बस सही आधार निर्देशिका की आवश्यकता थी। उत्तर पोस्ट करें और बक्षीस तुम्हारा है। –

+0

एक अन्य विचार सिम्लिंक की बजाय हार्ड लिंक का उपयोग करना होगा। या क्या कोई कारण है कि आपको सिम्लिंक की आवश्यकता क्यों है (जैसे अन्य माउंट पॉइंट इत्यादि)? – JochenJung

उत्तर

28

समस्या जो मैं आपके कोड से देखता हूं वह यह है कि __FILE__ स्वचालित रूप से सिम्लिंक हल करता है।

पीएचपी मैनुअल से Magic Constants

पर ... पीएचपी के बाद से 4.0.2, __FILE__ हमेशा संकल्प लिया सिमलिंक के साथ एक पूर्ण पथ है ...

इसके बजाय आप $_SERVER["SCRIPT_FILENAME"] उपयोग करने का प्रयास कर सकते हैं।

$root = realpath(dirname(dirname(dirname(dirname($_SERVER["SCRIPT_FILENAME"]))))); 
    if (file_exists($root.'/wp-load.php')) { 
     // WP 2.6 
     require_once($root.'/wp-load.php'); 
    } 

ध्यान दें कि मैं रूट निर्देशिका में realpath() समारोह गयी। आपके सेटअप के आधार पर, आपको इसकी आवश्यकता हो सकती है या नहीं।

संपादित करें: फ़ाइल सिस्टम पथ के लिए $_SERVER["PHP_SELF"] के बजाय $_SERVER["SCRIPT_FILENAME"] का उपयोग करें।

+0

PHP_SELF केवल वर्तमान प्रसंस्करण फ़ाइल का मान देता है। अंतिम परिणाम एक पूर्ण पथ होना चाहिए जो यूआरआई नहीं है। –

+0

मेरा बुरा ... मैं मूल रूप से सीएलआई से परीक्षण कर रहा था। इसके बजाय $ _SERVER ["SCRIPT_FILENAME"] का उपयोग करने के बारे में कैसे? यह मेरे पर्यावरण में काम किया। यदि यह $ _SERVER ["DOCUMENT_ROOT"] को $ _SERVER ["PHP_SELF"] में प्रीपेड करने के बारे में क्या काम नहीं करता है? – pferate

+0

आपकी समस्या का बग निम्नलिखित है: https://bugs.php.net/bug.php?id = 46260 अफसोस की बात है, PHP इस तरह से नहीं बदलेगा, जो मेरी राय में एक बग है। –

0

यदि मैं यह हल करने के लिए कोशिश कर रहे थे, मैं पथ बिट्स साथ __FILE__ विभाजित है और isDir और isLink साथ मार्ग में हर, परीक्षण के लिए एक SplFileInfo बनाएंगे, तो कैसे पथ के पुनर्निर्माण को संभालने के लिए एक बार यह निर्धारित करने का प्रयास अपेक्षा से अलग होने के लिए जाना जाता है ताकि आप सही निर्देशिका से खींच सकें। (यदि आप एक प्रक्रियात्मक प्रकार के अधिक हैं, तो is_dir और is_link है।)

ऐसा कहा जा रहा है कि, मुझे लगता है कि आप इस समाधान को पहले से ही अयोग्य घोषित कर चुके हैं। हो सकता है कि उपकरण आपके लिए ऐसा करने के लिए पर्याप्त स्मार्ट हों। getRealPath से getPath के परिणाम की तुलना करने का प्रयास करें? getRealPath स्पष्ट रूप से कहता है कि यह symlinks हल करता है, जबकि GetPath स्पष्ट रूप से यह नहीं कहता है।

तब भी, यह स्नीफिंग क्लाइंट साइटों पर सुरक्षित नहीं हो सकता है, मेजबान कौन है इस पर निर्भर करता है। मैंने कुछ सुंदर रचनात्मक साझा होस्टिंग फाइल सिस्टम सेटअप देखा है। आप php_uname पर एक चेक जोड़ सकते हैं और मशीन का होस्टनाम खींच सकते हैं, और यदि यह आपका देव बॉक्स नहीं है, तो अतिरिक्त कार्य न करें।

+1

दुर्भाग्यवश, 'getRealPath' और' getPath' सभी '/ trunk /' निर्देशिका को आउटपुट करते हैं। –

1

PHP दुभाषिया इसे संसाधित करने से पहले सिम्लिंक को हल करता है। आप इसे readlink फ़ंक्शन के साथ स्वयं कर सकते हैं। PHP लिंक को हल करता है क्योंकि यह *_once एपीसी, एक्सकैच इत्यादि जैसे कोड और कोड कैश के लिए अधिक कुशल है

आपको जो भी चाहिए, उसे ढूंढने का एक और तरीका यह है कि कोई विशेष इंस्टॉलेशन इसकी फ़ाइलों को संग्रहीत करता है। मैं {$_SERVER['DOCUMENT_ROOT']}/wp-content/wp-load.php का उपयोग करने की सलाह दूंगा /share/www/portfolio दस्तावेज़ रूट है।

+0

दस्तावेज़ रूट दुर्भाग्य से/शेयर/www/ –

2

आप इस कोड स्निपेट का उपयोग पथ प्राप्त करने के लिए कर सकते हैं जहां सिम्लिंक हल नहीं होते हैं। यदि आपके पास बैश उपलब्ध नहीं है, तो शायद आप एक अलग कमांड का उपयोग कर सकते हैं, लेकिन यह लिनक्स वातावरण पर काम करता है।

मुझे लगता है कि यह एक कदाचार है कि PHP FILE में सिम्लिंक को हल करता है, क्योंकि सिम्लिंक के साथ पथ प्राप्त करने का कोई तरीका नहीं है। अन्यथा हम इसे रीयलपाथ का उपयोग करके आसानी से प्राप्त कर सकते हैं।

ओह ठीक है।

<?php 
$output = array(); 
exec('pwd', &$output); 
define('__LINK__', $output[0].substr(__FILE__, strpos(__FILE__, DIRECTORY_SEPARATOR))); 
?> 
+1

'पीडब्ल्यूडी' रिटर्न मूल्य वर्तमान कामकाजी डीआईआर पर निर्भर करता है; वस्तुतः काम करने के लिए आपको पहले कार्य निर्देशक बदलना चाहिए: सीडी/var/www/wp-content/themes/twenty_twelve/&& php script.php – AndreyP

+0

मैंने '&', और '$ आउटपुट [0] 'को मेरे लिए काम किया । –

2

कुछ मामले तो संभव है ('लोक निर्माण विभाग') काम कर निर्देशिका बदलने के लिए और getenv का उपयोग में:

$root = dirname(dirname(dirname(getenv('PWD')))); 
if (file_exists($root.'/wp-load.php')) { 
    // WP 2.6 
    require_once($root.'/wp-load.php'); 
} 

और कार्यशील निर्देशिका से पहले इस कोड को चलाने के बदलने के लिए:

cd /var/www/wp-content/themes/twenty_twelve/ && php script.php 
1

यहाँ है उस मुद्दे का समाधान: https://github.com/logical-and/symlink-detective

$root = dirname(dirname(dirname(dirname(__FILE__)))); 
    if (file_exists(SymlinkDetective::detectPath($root.'/wp-load.php'))) { 
     // WP 2.6 
     require_once(SymlinkDetective::detectPath($root.'/wp-load.php')); 
    } 

या आप

try { 
    $root = dirname(dirname(dirname(dirname(__FILE__)))); 
    require_once SymlinkDetective::detectPath($root.'/wp-load.php', '', 
    false /* this would throw an exception if file doesn't exists */); 
} 
catch (Exception $e) { 
    // nothing to do if file doesn't exists 
} 
+1

मुझे वास्तव में समझ में नहीं आता कि आप मेरा जवाब क्यों हटा रहे हैं। मैंने इस मुद्दे के लिए समाधान लिखा, मैंने उदाहरण दिए कि इसका उपयोग कैसे किया जा सकता है, मैंने जवाब लिखा था। ऐसा करने की कोशिश करें, मेरी पोस्ट को हटाने के बजाय या मुझे कम से कम क्यों पता चले? क्या मेरी जानकारी उपयोगी नहीं है? – And

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

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