PHP प्रोजेक्ट का रूट डायरेक्टरी पाथ प्राप्त करें


115

मेरे PHP प्रोजेक्ट में यह फ़ोल्डर संरचना है। (यह जैसा है ग्रहणों में दिखाया गया है)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources

जब मैं इस कोड की कोशिश करता हूं

echo $_SERVER['DOCUMENT_ROOT']

आउटपुट है

डी: / कार्यक्षेत्र

मैं MySystemफ़ोल्डर के नाम को हार्डकोड किए बिना सिस्टम के रूटडायरेक्टरी ( ) के लिए रास्ता कैसे प्राप्त कर सकता हूं ?

जवाबों:


146

PHP के लिए = = 5.3.0 प्रयास करें

PHP मैजिक कांस्टेंट

__DIR__

और अपने रास्ते को सापेक्ष बनाओ।

के लिए पीएचपी <5.3.0 कोशिश

dirname(__FILE__)

3
यह सिर्फ भयानक है, मैंने $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] आदि की कोशिश की, लेकिन इसने बहुत बढ़िया काम किया!
वेबब्लोवर

78
यह निर्भर करता है कि आप कहां उपयोग करते हैं __DIR__ । यह फ़ाइल के सापेक्ष है, इसलिए यदि किसी उप निर्देशिका के अंदर शामिल है, तो यह आपकी रूट निर्देशिका को वापस नहीं करेगा।
आइरिस

10
यह रूट निर्देशिका नहीं देंगे
inrsaurabh

1
किसी के लिए भी त्वरित नोट जो इस प्रश्न के उत्तर की तलाश में ठोकर खाता है, डीआईआर को वर्तमान फ़ाइल की निर्देशिका मिलती है, जब तक कि आप इसे प्रोजेक्ट रूट में नहीं है, लेकिन जब तक php नहीं करता है, तब तक इसे रूट नहीं करता है। एक परियोजना की अवधारणा सभी रास्ते पूर्ण या वर्तमान स्थान के सापेक्ष होना जरूरी है
MikeT

कृपया एक ऐसे उत्तर को न छोड़ें जो प्रश्न को सही ढंग से संबोधित नहीं करता है, सिर्फ इसलिए कि इससे आपको मदद मिली।
एलीयन

73

जब आप कहते हैं कि

$_SERVER['DOCUMENT_ROOT']

इसमें यह पथ शामिल है:

D:/workspace

तो फिर D:तुम क्या देख रहे हो, है ना? उस स्थिति में आप स्लेश द्वारा स्ट्रिंग में विस्फोट कर सकते हैं और पहले एक को वापस कर सकते हैं:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

यह सर्वर के रूट डायरेक्टरी को आउटपुट करेगा।

अद्यतन: जब आप DIRECTORY_SEPARATORहार्डकैश स्लैश ( '/') के बजाय निरंतर का उपयोग करते हैं तो यह कोड विंडोज के तहत भी काम कर रहा है।

अद्यतन 2:$_SERVER वैश्विक वैरिएबल हमेशा उपलब्ध नहीं है। उदाहरण के लिए कमांड लाइन (cli) पर। इसलिए आपको __DIR__इसके बजाय उपयोग करना चाहिए $_SERVER['DOCUMENT_ROOT']__DIR__स्वयं php फ़ाइल का पथ देता है।


2
और आप __DIR__इसके बजाय उपयोग कर सकते हैं $_SERVER['DOCUMENT_ROOT']
Armin

क्षमा करें, यदि मैंने अपने प्रश्न को ठीक से नहीं समझाया है, तो मुझे वास्तव में क्या चाहिए 'डी: / कार्यक्षेत्र / MySystem'
नलका 526

1
यदि आपका रूट डाइरेक्टरी पथ / var / public / www के रूप में है, तो इस विधि का उपयोग करके ऐरे में पहला स्ट्रिंग खाली (0) / (1) / (2) / (3) होगा। रूट होगा दूसरा स्ट्रिंग $ pathInPiece [1]
tbradley22

36

PHP फ़ंक्शन का उपयोग करें:

getcwd()

वर्तमान कार्य निर्देशिका प्राप्त करता है।


1
यह CURRENT फ़ाइल पथ निष्पादित कर रहा है। रूट पथ नहीं
यौषा अलायबौ

9

मैं उस तरीके को इंगित करना चाहता हूं जिस तरह से वर्डप्रेस इसे संभालता है:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );

जैसा कि Wordpress वेब पर बहुत अधिक उपयोग किया जाता है और स्थानीय रूप से भी ठीक काम करता है, मुझे इस पद्धति पर बहुत भरोसा है।


1
मुझे लगता है कि यह केवल तब काम करता है जब आपके पास निर्देशिकाओं के दो स्तर होते हैं। सही? मेरा मतलब है, जब इसे base_project_directory / folder1 / folder2 / folder3 / file.php से कॉल किया जाता है, तो यह base_project_directory को वापस नहीं करता है।
अली खलीली

"जैसा कि वर्डप्रेस पूरे वेब पर बहुत भारी उपयोग किया जाता है और स्थानीय रूप से भी ठीक काम करता है, मुझे इस पद्धति पर बहुत भरोसा है।" मुझे नहीं लगता कि यह एक विशेष रूप से अच्छा तर्क है जिसे WP कोड गुणवत्ता और सुरक्षा ट्रैक रिकॉर्ड दिया गया है।
एलेक्स बार्कर

1
@AlexBarker मैं इस तथ्य का मुकाबला करूंगा कि WP का खराब सुरक्षा ट्रैक रिकॉर्ड है। यह वास्तव में बहुत सुरक्षित है और इसमें एक सम्मानजनक टीम है जो एकांतता पर केंद्रित है - कोर ने हाल के वर्षों में बहुत कम शोषण किए गए सुरक्षा मुद्दों को शामिल किया है (जब तक कि आप टिप्पणी करते हैं, तब तक वापस आ जाते हैं)।
विलियम पैटन

3

तुम कोशिश कर सकते हो: $_SERVER['PATH_TRANSLATED']

बोली:

फाइलसिस्टम- (डॉक्यूमेंट रुट- नहीं) वर्तमान स्क्रिप्ट पर आधारित है, सर्वर द्वारा किसी भी वर्चुअल-टू-रियल मैपिंग के बाद। नोट: PHP 4.3.2 के रूप में, PATH_TRANSLATEDअब Apache 1 में स्थिति के विपरीत Apache 2 SAPI के तहत निहित नहीं है, जहां यह SCRIPT_FILENAMEApache द्वारा पॉप्युलेट नहीं होने पर सर्वर चर के समान मान पर सेट होता है ।
यह परिवर्तन CGI विनिर्देश के अनुपालन के लिए किया गया था जिसे PATH_TRANSLATED केवल तभी मौजूद होना चाहिए जब PATH_INFOपरिभाषित किया गया हो। अपाचे 2 उपयोगकर्ताओं को परिभाषित करने के लिए AcceptPathInfo = Onअंदर httpd.confका उपयोग कर सकते हैंPATH_INFO

स्रोत: php.net/manual



0

सारांश

यह उदाहरण मानता है कि आप हमेशा जानते हैं कि अपाचे रूट फ़ोल्डर '/ var / www /' है और आप अगले फ़ोल्डर पथ (जैसे '/ var / www / my_website_folder') को खोजने का प्रयास कर रहे हैं। इसके अलावा यह एक स्क्रिप्ट या वेब ब्राउज़र से काम करता है जिसके कारण अतिरिक्त कोड होता है।

कोड PHP7

function getHtmlRootFolder(string $root = '/var/www/') {

    // -- try to use DOCUMENT_ROOT first --
    $ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
    $ret = rtrim($ret, '/') . '/';

    // -- if doesn't contain root path, find using this file's loc. path --
    if (!preg_match("#".$root."#", $ret)) {
      $root = rtrim($root, '/') . '/';
      $root_arr = explode("/", $root);
      $pwd_arr = explode("/", getcwd());
      $ret = $root . $pwd_arr[count($root_arr) - 1];
    }

    return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}

उदाहरण

echo getHtmlRootFolder();

आउटपुट:

/var/www/somedir/

विवरण:

मूल रूप से पहले DOCUMENT_ROOT प्राप्त करने की कोशिश करता है अगर इसमें '/ var / www /' शामिल है तो इसका उपयोग करें, अन्यथा वर्तमान dir (जो कि परियोजना के अंदर मौजूद है) प्राप्त करें और $ रूट पथ की गणना के आधार पर अगला पथ मान प्राप्त करें। नोट: सभी मामलों में '/' के साथ समाप्त होने वाले पथ रिटर्न को सुनिश्चित करने के लिए जोड़ा गया rtrim विवरण। यह / var / www / से बड़ा होने की आवश्यकता के लिए इसकी जाँच नहीं करता है / यह एक संभावित प्रतिक्रिया के रूप में / var / www / भी वापस कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.