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

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

script.php

inc/include1.php
inc/include2.php

objects/object1.php
objects/object2.php

soap/soap.php

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

तो क्या सापेक्ष पथ का उपयोग करने का कोई तरीका है, या प्रोग्रामिक रूप से "/ mnt / webdev / [प्रोजेक्ट नाम] /" उत्पन्न करने का एक तरीका है?

0
ro fr bn

10 उत्तर

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

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

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

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

0
जोड़ा
मुझे लगता है कि आपको FILE नाम से .. को अलग करने के लिए उद्धृत अभिव्यक्ति की शुरुआत में / जोड़ना चाहिए।
जोड़ा लेखक Dunaril, स्रोत
ध्यान दें कि PHP 5.3.0 के बाद से आप dirname (__ FILE __) का उपयोग करने के बजाय जादू निरंतर __ DIR __ का उपयोग कर सकते हैं। (PHP दस्तावेज़)
जोड़ा लेखक Erwin Wessels, स्रोत
<कोड> डायरनाम (__ फ़ाइल __) शामिल करें। '/ .. / inc / include.php'; सापेक्ष पथ से पहले "/" को मत भूलें।
जोड़ा लेखक Steven Leimberg, स्रोत

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

0
जोड़ा

मुझे लगता है कि आपके 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 + + पथ शामिल

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

0
जोड़ा
    

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

  

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

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

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

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

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

जो कुछ भी।

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

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

0
जोड़ा

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

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

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

Edit: added imporvement by aussieviking

0
जोड़ा
सिर्फ एक प्रश्न, $ _SERVER ["DOCUMENT_ROOT"] के लिए realpath() क्यों? यह हमेशा कैननिकल पथ आउटपुट नहीं करेगा?
जोड़ा लेखक João Pimentel Ferreira, स्रोत
सावधान रहें, यह केवल तब ही काम करेगा जब आप एक वेब सर्वर के माध्यम से स्क्रिप्ट निष्पादित करते हैं जो DOCUMENT_ROOT
जोड़ा लेखक Phil, स्रोत

केविन से संबंधित एक अन्य विकल्प, __ FILE __ का उपयोग करता है, लेकिन इसके बजाय PHP फ़ाइल नाम को इसके अंदर से प्रतिस्थापित करें:

<?php

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

?>

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

0
जोड़ा

have a look at http://au.php.net/reserved.variables

I think the variable you are looking for is: $_SERVER["DOCUMENT_ROOT"]

0
जोड़ा

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

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

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

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

0
जोड़ा

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

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

?>
0
जोड़ा

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

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

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

पूर्व:

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

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

0
जोड़ा