कैसे PHP फ़ाइलों को शामिल करने के लिए एक पूर्ण पथ की आवश्यकता है?


95

मेरे पास निम्नलिखित की तरह एक निर्देशिका संरचना है;

script.php

inc / शामिल 1। एफपी
इंक / शामिल 2। एफपी

वस्तुओं / object1.php
वस्तुओं / object2.php

साबुन / soap.php

अब, मैं उन वस्तुओं का उपयोग करता हूं script.phpऔर दोनों में /soap/soap.php, मैं उन्हें स्थानांतरित कर सकता हूं, लेकिन मैं एक विशेष कारण के लिए उस तरह की निर्देशिका संरचना चाहता हूं। जब क्रियान्वित script.phpशामिल मार्ग है inc/include.phpऔर जब क्रियान्वित /soap/soap.phpयह है ../inc, निरपेक्ष पथ काम करते हैं, /mnt/webdev/[project name]/inc/include1.php...लेकिन यह एक बदसूरत समाधान है कि अगर मैं कभी भी किसी दूसरे स्थान पर निर्देशिका ले जाना चाहते हैं।

तो क्या रिश्तेदार रास्तों का उपयोग करने का एक तरीका है, या प्रोग्रामेटिक रूप से उत्पन्न करने का एक तरीका है "/mnt/webdev/[project name]/"?

जवाबों:


149

यह काम करना चाहिए

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

संपादित करें: ऑस्ट्रेलियाई द्वारा जोड़ा गया संसेचन


2
सावधान रहें, यह केवल तभी काम करेगा जब आप स्क्रिप्ट को एक वेब सर्वर के माध्यम से निष्पादित करेंगे जो पॉप्युलेट करता हैDOCUMENT_ROOT
Phil

बस एक सवाल, क्यों realpath () $ _SERVER ["DOCUMENT_ROOT"] के लिए? यह हमेशा कैनोनिकल पथ का उत्पादन नहीं करेगा?
जोआओ पिमेंटेल फेरेरा

44

आप सापेक्ष रास्तों का उपयोग कर सकते हैं। कोशिश करो __FILE__। यह एक PHP स्थिरांक है जो हमेशा उस स्क्रिप्ट के पथ / फ़ाइलनाम को लौटाता है जो वह अंदर है। इसलिए soap.php, आप कर सकते हैं:

include dirname(__FILE__).'/../inc/include.php';

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

एक अन्य समाधान में शामिल पथ निर्धारित करना होगा आप अपनी httpd.conf या .htaccess फ़ाइल में करें।


8
मुझे लगता है कि आपको फील नाम से /अलग करने के लिए उद्धृत अभिव्यक्ति की शुरुआत में जोड़ना चाहिए । ..
डुनरिल

9
ध्यान दें कि PHP 5.3.0 के बाद से आप जादू __DIR__का उपयोग करने के बजाय निरंतर उपयोग कर सकते हैं dirname(__FILE__)(PHP डॉक्स)
इरविन वेसल्स

3
include dirname(__FILE__).'/../inc/include.php';रिश्तेदार पथ से पहले "/" मत भूलना।
स्टीवन लीमबर्ग

6

इसे संभालने का एक और तरीका जो किसी भी जरूरत को दूर करता है, वह है ऑटोलैड फीचर का उपयोग करना । सब कुछ शामिल है आपकी स्क्रिप्ट की जरूरत है "जस्ट इन केस" प्रदर्शन को बाधित कर सकता है। यदि आपकी सम्‍मिलित सभी कक्षाएँ या इंटरफ़ेस परिभाषाएँ हैं, और आप केवल जरूरत पड़ने पर उन्हें लोड करना चाहते हैं, तो आप __autoload()उपयुक्त वर्ग फ़ाइल को खोजने के लिए अपने कोड के साथ फ़ंक्शन को ओवरलोड कर सकते हैं और इसे केवल तभी लोड कर सकते हैं जब इसे कॉल किया जाता है। यहाँ मैनुअल से उदाहरण है:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

जब तक आप अपने शामिल करने के लिए अपने चर_ सेट चर के अनुसार, आप एक वर्ग फ़ाइल फिर से शामिल करने की जरूरत नहीं है।



5

आप अपनी परियोजना के रूट डायरेक्टरी के मार्ग के साथ एक स्थिरांक को परिभाषित कर सकते हैं, और फिर पथ की शुरुआत में रख सकते हैं।


2

एक अन्य विकल्प, केविन से संबंधित है, उपयोग है __FILE__, लेकिन इसके बजाय php फ़ाइल नाम को इसके भीतर से प्रतिस्थापित करें:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

मैं थोड़ी देर के लिए यह प्रयोग किया गया है। एकमात्र समस्या कभी-कभी आपके पास नहीं होती है $_SERVER['SCRIPT_NAME'], लेकिन कभी-कभी एक और चर समान होता है।


2

मुझे यह बहुत अच्छी तरह से काम करने के लिए मिला!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

उपयोग:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

1

मुझे लगता है कि सबसे अच्छा तरीका है अपने PHP शामिल पथ में अपने शामिल है। आपके सेटअप के आधार पर ऐसा करने के विभिन्न तरीके हैं।

तो आप बस का उल्लेख कर सकते हैं

require_once 'inc1.php';

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

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

जैसे

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

इसके अलावा, वर्ग फ़ाइलों की आलसी लोडिंग के लिए __autoload देखें

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload


1
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

मैं इस कोड की लाइन का उपयोग करता हूं। यह साइट के पेड़ के "शीर्ष" पर वापस जाता है, फिर वांछित फ़ाइल पर जाता है।

उदाहरण के लिए, मान लें कि मेरे पास यह फ़ाइल ट्री है:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

मैं कॉपी पेस्ट करके, जहाँ कहीं भी हूँ, फंक्शन्स.php फ़ाइल को शामिल कर सकता हूँ

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

यदि आपको कई बार इस कोड का उपयोग करने की आवश्यकता है, तो आप एक फ़ंक्शन बना सकते हैं जो str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))भाग लौटाता है । फिर इस फ़ंक्शन को पहले फ़ाइल में सम्मिलित करें जिसमें आप शामिल हैं। मेरे पास एक "initialize.php" फाइल है जिसमें मैं प्रत्येक php पृष्ठ के शीर्ष पर शामिल हूं और जिसमें यह फ़ंक्शन है। अगली बार जब मुझे फ़ाइलें शामिल करनी हैं, तो मैं वास्तव में फ़ंक्शन (नाम path_back) का उपयोग करता हूं :

require(path_back()."/_resources/another_php_file.php");

0

@Flubba, क्या यह मुझे मेरी निर्देशिका में शामिल करने की अनुमति देता है? फ्लैट में डायरेक्ट्रीज मुझे बुरे सपने देते हैं। के रूप में पूरी वस्तुओं निर्देशिका inc निर्देशिका में होना चाहिए।

अरे हाँ, बिल्कुल। तो उदाहरण के लिए, हम सबफ़ोल्डर्स की एक परत का उपयोग करते हैं, आम तौर पर:

require_once('library/string.class.php')

आपको वास्तव में उच्च ट्रैफ़िक साइटों में शामिल पथ पर निर्भर होने के साथ सावधान रहने की आवश्यकता है, क्योंकि php को वर्तमान निर्देशिका के माध्यम से शिकार करना पड़ता है और फिर शामिल पथ पर सभी निर्देशिकाओं को देखने के लिए कि क्या आपकी फ़ाइल है और यह धीमा हो सकता है चीजों को अगर आप अंकित हो रहे हैं।

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

'model/user.class'
'controllers/front.php'

जो कुछ भी।

लेकिन आम तौर पर बोलना, यह आपको अपने PHP में वास्तव में छोटे रास्तों के साथ काम करने देता है जो कहीं से भी काम करेगा और यह सब उस realpath दस्तावेज़ रूट malarkey की तुलना में पढ़ना बहुत आसान है।

उन स्क्रिप्ट-आधारित विकल्पों का लाभ जो दूसरों ने सुझाए हैं, वे साझा बक्सों पर भी कहीं भी काम करते हैं; शामिल पथ को सेट करने के लिए थोड़ा अधिक विचार और प्रयास की आवश्यकता होती है, लेकिन जैसा कि मैंने उल्लेख किया है कि आप __autoload का उपयोग करना शुरू कर सकते हैं जो कि सबसे अच्छा है।


0

यदि आप अपने एप्लिकेशन की अधिकांश फ़ाइलों में विशिष्ट पथ शामिल करने जा रहे हैं, तो अपने रूट फ़ोल्डर में एक वैश्विक चर बनाएं।

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

अब यह वैश्विक चर " APPLICATION_PATH " " का उपयोग रियलपिट () में हर बार नई फाइल को शामिल करने के बजाय सभी फाइलों को शामिल करने के लिए किया जा सकता है।

पूर्व:

include(APPLICATION_PATH ."/config/config.ini";

आशा करता हूँ की ये काम करेगा ;-)

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