आरंभिक स्क्रिप्ट चलाने का पूर्ण पथ प्राप्त करें


247

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

स्पष्टता: आरंभ में निष्पादित स्क्रिप्ट, जरूरी नहीं कि वह फाइल जहां समाधान कोडित हो।


वास्तव में मैथेडिनक्लाउड्स। मैंने इसे बहुत पहले स्वीकार किया था जब मेरे पास केवल एक स्क्रिप्ट थी और यह मेरे लिए काम करती थी। मैंने स्वीकार किए गए उत्तर को हटा दिया ताकि यह स्पष्ट हो सके कि यह प्रारंभिक समस्या को हल नहीं करता है। जब स्क्रिप्ट में निष्पादन शुरू होता है तो File स्थिरांक को एक तरह से जाना जाता है, लेकिन आदर्श से बहुत दूर।
पूछताछ

अनुरोधित स्क्रिप्ट वह है जो आप चाहते थे, वर्तमान स्क्रिप्ट = इस समाधान कोड के साथ
Bitterblue

जवाबों:


33

get_included_filesफ़ंक्शन का उपयोग करने के लिए सही समाधान है :

list($scriptPath) = get_included_files();

इससे आपको प्रारंभिक लिपि का पूर्ण मार्ग मिलेगा, भले ही:

  • यह फ़ंक्शन किसी सम्मिलित फ़ाइल के अंदर रखा गया है
  • वर्तमान कामकाजी निर्देशिका प्रारंभिक स्क्रिप्ट की निर्देशिका से अलग है
  • स्क्रिप्ट को सीएलआई के साथ एक रिश्तेदार पथ के रूप में निष्पादित किया जाता है

यहां दो परीक्षण स्क्रिप्ट हैं; मुख्य स्क्रिप्ट और एक सम्मिलित फ़ाइल:

# C:\Users\Redacted\Desktop\main.php
include __DIR__ . DIRECTORY_SEPARATOR . 'include.php';
echoScriptPath();

# C:\Users\Redacted\Desktop\include.php
function echoScriptPath() {
    list($scriptPath) = get_included_files();
    echo 'The script being executed is ' . $scriptPath;
}

और परिणाम; वर्तमान निर्देशिका पर ध्यान दें:

C:\>php C:\Users\Redacted\Desktop\main.php
The script being executed is C:\Users\Redacted\Desktop\main.php

यह समाधान काम करता है लेकिन यह ध्यान देने योग्य है कि, दस्तावेज़ीकरण को पढ़ते हुए , इस बात का कोई उल्लेख नहीं है कि शुरू में चलने वाली स्क्रिप्ट का पथ द्वारा लौटाए गए सरणी का पहला आइटम है get_included_files()। मेरा सुझाव है __FILE__कि स्क्रिप्ट की शुरुआत में एक निरंतर स्टोर करने का मतलब है कि शुरू में चलाया जाए।
पाओलो

270

__FILE__ निरंतर आपको वर्तमान फ़ाइल के लिए निरपेक्ष पथ देगा।

अपडेट :

यह प्रश्न पूछने के लिए बदल दिया गया था कि वर्तमान में चल रही स्क्रिप्ट के बजाय आरंभिक निष्पादित स्क्रिप्ट को कैसे पुनः प्राप्त किया जाए। फ़ंक्शन का उपयोग करने का एकमात्र (??) विश्वसनीय तरीका है debug_backtrace

$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];

अगर मैं फ्रंट कंट्रोलर पैटर्न का उपयोग कर रहा हूं। क्या __FILE__index.php का स्थान या शामिल फ़ाइल का स्थान वापस आ जाएगा? मैं index.php का स्थान कैसे प्राप्त करूंगा?
CMCDragonkai

अच्छी तरह __FILE__से वर्तमान स्क्रिप्ट के मार्ग को इंगित करता है। लेकिन मुझे वर्तमान index.php की राह दिखाने के लिए कुछ भी नहीं मिला है।
CMCDragonkai

1
@CMCDragonkai: तब एक अलग सवाल पूछें
झटके

2
चेतावनी: यदि स्क्रिप्ट Apache2 वर्चुअल निर्देशिका में है, तो दी गई जानकारी भौतिक सर्वर पर वास्तविक पथ स्थान प्रदान नहीं करती है। मैं इसे डिबग उद्देश्यों के लिए चाहता था, और यहां तक ​​कि $ _SERVER चर भी इसे प्रदान नहीं करते हैं। उदाहरण के लिए, यदि index.php / var / www / vpath1 / html और / var / www / html / और / var / www / vpath2 / html में मौजूद है, और इनमें से प्रत्येक वस्तुतः / var / www / html से मैप किया गया है तब / var / www / html आप क्या देखेंगे, कोई फर्क नहीं पड़ता कि किस वर्चुअल सर्वर का उपयोग किया जाता है।
मार्क रिचर्ड्स

1
@ChristofferBubach को आपको इसे फेंकने की आवश्यकता नहीं है: एक अपवाद ऑब्जेक्ट निर्माण के दौरान स्टैक ट्रेस एकत्र करता है।
zerkms

262

उत्तर को यहां स्थानांतरित कर दिया गया है - https://stackoverflow.com/a/26944636/2377343


1
स्क्रिप्ट का वर्तमान फ़ोल्डर पाने के लिएstr_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
सलेम

2
यह उन सभी तरीकों की सबसे व्यापक सूची है, जिनमें से पूरे इंटरनेट पर मैंने या फ़ाइल पथ के सभी भाग प्राप्त किए हैं।
बीन

241
echo realpath(dirname(__FILE__));

यदि आप इसे किसी सम्मिलित फ़ाइल में रखते हैं, तो यह इसमें शामिल पथ को प्रिंट करता है। मूल स्क्रिप्ट का पथ प्राप्त करने के लिए, इसके __FILE__साथ बदलें $_SERVER['PHP_SELF']। लेकिन ध्यान रखें कि PHP_SELF एक सुरक्षा जोखिम है!


1
यह वही था जो मैं चाहता था
9

13
यहाँ realpath का क्या उपयोग है?
आपका कॉमन सेंस

11
@Col। Shrapnel: "चूंकि PHP 4.0.2, में __FILE__हमेशा हल किए गए सिम्बल के साथ एक पूर्ण पथ होता है , जबकि पुराने संस्करणों में इसमें कई परिस्थितियों में सापेक्ष पथ समाहित होता है।" प्लस "dirname () इनपुट स्ट्रिंग पर सरलता से संचालित होता है, और वास्तविक फाइल सिस्टम, या '..' जैसे पथ घटकों के बारे में पता नहीं है।
rik

6
ओह, 4.0.2। पीछ्ली शताब्दी?
आपका कॉमन सेंस

2
@ भी: सुरक्षा मुद्दा क्या कारण हो सकता है PHP_SELF??
झटके

38
__DIR__

से मैनुअल :

फ़ाइल की निर्देशिका। यदि किसी शामिल के अंदर उपयोग किया जाता है, तो शामिल फ़ाइल की निर्देशिका वापस कर दी जाती है। इसके बराबर है dirname(__FILE__)। जब तक यह रूट डायरेक्टरी न हो, तब तक इस निर्देशिका नाम में अनुगामी स्लेश नहीं होता है।
__FILE__ सदैव सम्‍मिलित पथ के साथ एक पूर्ण पथ सम्‍मिलित होता है जबकि पुराने संस्करणों में (4.0.2 से अधिक) इसमें कुछ परिस्थितियों में सापेक्ष पथ समाहित होता है।

ध्यान दें : __DIR__PHP 5.3.0 में जोड़ा गया था।


21

यदि आप वर्तमान कार्यशील निर्देशिका का उपयोग करना चाहते हैंgetcwd()

http://php.net/manual/en/function.getcwd.php

__FILE__XAMPP पर उदाहरण के लिए फ़ाइल नाम के साथ पथ वापस आ जाएगी C:\xampp\htdocs\index.phpबजायC:\xampp\htdocs\


8
dirname(__FILE__) 

दे देंगे पूर्ण मार्ग वर्तमान फ़ाइल का जिससे आप मार्ग, अपने सर्वर निर्देशिका के मार्ग की माँग कर रहे हैं।

उदाहरण फ़ाइलें:

www / http / html / index.php; यदि आप इस कोड को अपने index.php के अंदर रखते हैं तो यह वापस आ जाएगा:

<?php echo dirname(__FILE__); // this will return: www/http/html/

www / http / html / वर्ग / myclass.php; यदि आप इस कोड को अपने myclass.php के अंदर रखते हैं तो यह वापस आ जाएगा:

<?php echo dirname(__FILE__); // this will return: www/http/html/class/


7

बस नीचे का उपयोग करें:

echo __DIR__;

1
Sry, यह विचार है कि पहली निकाल दी गई स्क्रिप्ट प्राप्त करें ... वह नहीं जो आप अब होने वाले हैं। तो के शामिल किए जाने के पेड़ a.php->b.php->c.phpके पथ होना चाहिए a.php में जाँच करता है, तो c.php । एकमात्र तरीका जो विश्वसनीय लगता है वह debug_backtrace () फ़ंक्शन का उपयोग करना है।
14

5
`realpath(dirname(__FILE__))` 

यह आपको वर्तमान स्क्रिप्ट (वह स्क्रिप्ट जिसके अंदर आपने यह कोड रखा है) डायरेक्टरी देता है बिना किसी स्लैश के। यदि आप परिणाम के साथ अन्य फ़ाइलों को शामिल करना चाहते हैं तो यह महत्वपूर्ण है


हाँ, लेकिन विचार यह है कि "फायरिंग स्क्रिप्ट" के लिए पूर्ण पथ प्राप्त करने में सक्षम होना चाहिए। एफ़पी भी B.php के अंदर अगर यह एएफ़पी द्वारा शामिल है। बाद की पहुँच के लिए प्रारंभिक स्क्रिप्ट को संग्रहीत करके यह किया जा सकता है या किया जा सकता है, लेकिन सवाल यह था कि क्या ऐसा किए बिना इसे प्राप्त करना संभव है।
पूछताछ

4

यदि आप सर्वर रूट के सापेक्ष पूर्ण पथ की तलाश कर रहे हैं, तो मैंने पाया है कि यह अच्छी तरह से काम करता है:

$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])

जब मैं अलग-अलग सर्वरों के खिलाफ इस समाधान की जाँच कर रहा था, तो इसने मुझे हमेशा होस्ट के OS (विंडोज और लिनक्स) की परवाह किए बिना dir विभाजक जैसे लाइनक्स के साथ रास्ता दिया। मेरे लिए यह एक फायदा है।
ब्रोनक

3

यहाँ एक उपयोगी PHP फ़ंक्शन है जो मैंने इसके लिए लिखा था। जैसा कि मूल प्रश्न स्पष्ट करता है, यह उस पथ को लौटाता है जिससे प्रारंभिक स्क्रिप्ट निष्पादित की गई थी - उस फ़ाइल को नहीं जो हम वर्तमान में हैं।

/**
 * Get the file path/dir from which a script/function was initially executed
 * 
 * @param bool $include_filename include/exclude filename in the return string
 * @return string
 */ 
function get_function_origin_path($include_filename = true) {
    $bt = debug_backtrace();
    array_shift($bt);
    if ( array_key_exists(0, $bt) && array_key_exists('file', $bt[0]) ) {
        $file_path = $bt[0]['file'];
        if ( $include_filename === false ) {
            $file_path = str_replace(basename($file_path), '', $file_path);
        }
    } else {
        $file_path = null;
    }
    return $file_path;
}


1
realpath($_SERVER['SCRIPT_FILENAME'])

वेब सर्वर के तहत चलने वाली स्क्रिप्ट के $_SERVER['SCRIPT_FILENAME']लिए आरंभिक स्क्रिप्ट के लिए पूर्ण पथ होगा, इसलिए संभवतः आपका index.php।realpath()इस मामले में आवश्यक नहीं है।

कंसोल से चलाए जाने वाले स्क्रिप्ट के लिए $_SERVER['SCRIPT_FILENAME']आपके वर्तमान कार्यशील डायर से आपके द्वारा शुरू की गई स्क्रिप्ट के सापेक्ष पथ होगा। इसलिए जब तक आप अपनी स्क्रिप्ट के अंदर वर्किंग डायरेक्टरी नहीं बदलेंगे, यह निरपेक्ष पथ पर चलेगा।


1

यह वही है जो मैं उपयोग करता हूं और यह लिनक्स वातावरण में काम करता है। मुझे नहीं लगता कि यह विंडोज मशीन पर काम करेगा ...

//define canonicalized absolute pathname for the script
if(substr($_SERVER['SCRIPT_NAME'],0,1) == DIRECTORY_SEPARATOR) {
    //does the script name start with the directory separator?
    //if so, the path is defined from root; may have symbolic references so still use realpath()
    $script = realpath($_SERVER['SCRIPT_NAME']);
} else {
    //otherwise prefix script name with the current working directory
    //and use realpath() to resolve symbolic references
    $script = realpath(getcwd() . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_NAME']);
}

1

एक आसान तरीका के निरपेक्ष पथ के लिए शुरू में निष्पादित स्क्रिप्ट कि स्क्रिप्ट में, और किसी भी अन्य स्क्रिप्ट के साथ शामिल include, require, require_onceएक का उपयोग करना है निरंतर और की शुरुआत में वहाँ वर्तमान स्क्रिप्ट पथ भंडारण मुख्य स्क्रिप्ट :

define( 'SCRIPT_ROOT', __FILE__ );

उपरोक्त समाधान तब उपयुक्त होता है जब एक "मुख्य" स्क्रिप्ट होती है जो includeहर दूसरे आवश्यक स्क्रिप्ट की तरह होती है, जैसा कि अधिकांश वेब अनुप्रयोगों में होता है।

अगर ऐसा नहीं है और फिर भी कई "अंतरंग लिपियाँ" हो सकती हैं, तो पुनर्परिभाषित से बचने के लिए और प्रत्येक स्क्रिप्ट के साथ शुरू होने वाले निरंतर के अंदर सही पथ संग्रहीत हो सकता है:

if( ! defined( 'SCRIPT_ROOT' ) ) {
    define( 'SCRIPT_ROOT`, __FILE__ );
}

(वर्तमान में) स्वीकृत उत्तर के बारे में एक नोट :

उत्तर बताता है कि शुरू में निष्पादित स्क्रिप्ट पथ द्वारा लौटाए गए सरणी का पहला तत्व है get_included_files()

यह एक चतुर और सरल समाधान है और यह लिखने का समय है- (हम लगभग PHP 7.4.0 पर हैं) यह काम करता है

हालाँकि दस्तावेज़ीकरण को देखते हुए इस बात का कोई उल्लेख नहीं है कि शुरू में निष्पादित स्क्रिप्ट सरणी द्वारा लौटाए गए सरणी का पहला आइटम हैget_included_files()

हम केवल पढ़ते हैं

मूल रूप से कहा जाने वाला स्क्रिप्ट "शामिल फ़ाइल" माना जाता है, इसलिए इसे शामिल और परिवार द्वारा संदर्भित फ़ाइलों के साथ सूचीबद्ध किया जाएगा।

" स्क्रिप्ट को मूल रूप से कहा जाता है " लिखने के समय यह सरणी में पहला है, लेकिन तकनीकी रूप से - इसमें कोई गारंटी नहीं है कि यह भविष्य में नहीं बदलेगा।


एक नोट के बारे में realpath(), __FILE__और __DIR__:

अन्य लोग उनके जवाब में के उपयोग का सुझाव दिया है __FILE__, __DIR__, dirname(__FILE__), realpath(__DIR__)...

dirname(__FILE__)__DIR__(PHP 5.3.0 में पेश किया गया) के बराबर है , इसलिए बस उपयोग करें __DIR__

दोनों __FILE__और __DIR__हमेशा पूर्ण पथ हैं इसलिए realpath()अनावश्यक है।

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