2008-08-07 9 views
82

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

script.php

इंक/include1.php
इंक/include2.php

वस्तुओं/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]/" उत्पन्न करने का कोई तरीका है?

उत्तर

138

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

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

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

संपादित करें:aussieviking

+0

सावधान रहो, यह केवल कभी यदि आप एक वेब सर्वर है कि $ _SERVER [ "DOCUMENT_ROOT"] के लिए 'DOCUMENT_ROOT' – Phil

+0

सिर्फ एक सवाल, क्यों realpath() भरता है के माध्यम से स्क्रिप्ट को निष्पादित काम करेंगे? यह हमेशा कैननिकल पथ आउटपुट नहीं करेगा? –

6

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

8

द्वारा imporvement जोड़ा http://au.php.net/reserved.variables

पर एक नज़र मुझे लगता है कि चर आप देख रहे हैं क्या है: $_SERVER["DOCUMENT_ROOT"]

40

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

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

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

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

+8

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

+8

ध्यान दें कि PHP 5.3.0 के बाद से आप 'dirname (__ फ़ाइल __)' का उपयोग करने के बजाय जादू निरंतर '__DIR__' का उपयोग कर सकते हैं। [(PHP दस्तावेज़)] (http://www.php.net/manual/en/language.constants.predefined.php) –

+3

'डायरनाम (__ फ़ाइल __) शामिल करें।'/../inc/include.php '; ' सापेक्ष पथ से पहले "/" मत भूलना। –

1

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

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

require_once 'inc1.php'; 

देख सकते हैं।

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

उदा।

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

इसके अलावा, वर्ग फ़ाइलों

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

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

0

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

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

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

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

इसलिए उदाहरण के लिए यदि आप MVC कर रहे हैं के लिए, आप पथ आपके आवेदन Directoy को शामिल रास्ते में रखा और फिर प्रपत्र

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

या जो कुछ भी में चीजों का उल्लेख निर्दिष्ट करें।

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

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

<?php 

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

?> 

मैं थोड़ी देर के लिए यह प्रयोग कर रहे:

3

एक अन्य विकल्प, केविन के लिए संबंधित, __FILE__ उपयोग करते हैं, लेकिन इसके बजाय यह भीतर से php फ़ाइल नाम की जगह है। एकमात्र समस्या यह है कि कभी-कभी आपके पास $_SERVER['SCRIPT_NAME'] नहीं है, लेकिन कभी-कभी एक और चर समान होता है।

4

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

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

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

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

3

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

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'); 

?> 
2
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
डोमेन। com/_resources/functions.php

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

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

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

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

एक छोटा रास्ता

include($_SERVER['DOCUMENT_ROOT']."/inc/include1.php"); 

'DOCUMENT_ROOT': दस्तावेज़ रूट निर्देशिका है जिसके तहत सर्वर की कॉन्फ़िगरेशन फ़ाइल में परिभाषित अनुसार वर्तमान स्क्रिप्ट निष्पादन है।

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

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