2011-12-02 23 views
12

यदि मैं पूर्ण पथ का उपयोग करता हूं, तो मैं पूरी निर्देशिका को किसी नए स्थान पर नहीं ले जा सकता। यदि मैं सापेक्ष पथ का उपयोग करता हूं, तो मैं अलग-अलग फ़ाइलों को नए स्थानों पर नहीं ले जा सकता।पूर्ण बनाम सापेक्ष पथ

यहां क्या समाधान है? क्या आप एक कॉन्फ़िगरेशन फ़ाइल सेट अप करते हैं जिसमें रूट पथ होता है और वहां से जाता है? या आपके पास ऐसा नियम है: कभी भी फ़ाइलों को स्थानांतरित न करें?

मैंने कुछ परियोजनाओं में देखा है कि लोग डायरनाम (FILE) का उपयोग करते हैं। इसका क्या मतलब है, मेरा मतलब है, क्यों न सिर्फ नाम छोड़ने के बाद इसे छोड़ दें (फ़ाइल कहां बैठती है) के आधार पर?

+0

'dirname के उपयोग (__FILE __) 'या' __DIR__' यह है कि फ़ाइल शामिल होने पर भी यह वर्तमान स्क्रिप्ट की निर्देशिका वापस कर देगी। यदि आपके पास एक फ़ाइल है जिसमें dir/script.php शामिल है, तो डिफ़ॉल्ट शामिल है script.php में पथ रूट होगा और dir/नहीं होगा। – Kokos

+1

@ फ्रैंक विला: * क्या आप एक कॉन्फ़िगरेशन फ़ाइल सेट करते हैं जिसमें रूट पथ है और वहां से जाना है? * ** हाँ ** –

+0

मैं इस पर बहुत बुरा हूं, लेकिन मुझे लगता है कि विचार उन दोनों को मिश्रण करना है। बु फ़ाइल में मुख्य स्क्रिप्ट और सापेक्ष-पथ के लिए पूर्ण पथ जोड़ना और स्क्रिप्ट में उपयोग किया जाता है। बेशक, आप सापेक्ष-पथ घोषणा में कुछ भी बदले बिना किसी भी सापेक्ष पथ का उपयोग करके फ़ाइलों को कभी भी स्थानांतरित नहीं कर सकते हैं। – OptimusCrime

उत्तर

14

आप अपने रूट निर्देशिका के अंदर कि प्रत्येक फ़ाइल पहली पंक्ति में शामिल किया जाएगा एक कॉन्फ़िग फ़ाइल, उदाहरण के लिए अपने अनुप्रयोग इस

जड़ की तरह लग रहे/ऐप्स/प्लगइन्स

उपयोग करना चाहिए: app-config.php

if (!defined('ABSPATH')) 
    define('ABSPATH', dirname(__FILE__) . '/'); 

अब, अपने प्लगइन निर्देशिका के अंदर आप एक प्लगइन फ़ाइल को शामिल करने के लिए है लगता है, तो

: my-plugin.php

require_once '../../app-config.php'; 

अब इस रेखा के नीचे सब कुछ ABSPATH

उदाहरण का उपयोग कर सकते हैं अब एक छवि

<img src='".ABSPATH."Public/images/demo.png' alt=''/> 

लोड करना चाहते हैं करते हैं, बात अधिक सरल होगा कि आपके ऐप स्वचालित रूप से कुछ लोड करने के लिए डिज़ाइन किया गया है

plugin-widget-1.php 

जैसी फ़ाइलें ताकि इस फ़ाइल या किसी अन्य के अंदर सबकुछ my-plugin.php फ़ाइल द्वारा लोड की गई फ़ाइल ABSPATH का उपयोग कर सकते हैं, प्रत्येक बार app-config.php फ़ाइल शामिल किए बिना।

इस के साथ

मन में आप सभी छोटे हाथ आप चाहते हैं app-config.php उदाहरण में

define('UPLOAD_PATH', ABSPATH. 'Public/uploads/'); 
define('IMAGES_PATH', ABSPATH. 'Public/images/'); 
define('HELPERS_PATH', ABSPATH. 'App/helpers/'); 
... 

ताकि आप सभी को परिभाषित किया है हो सकता है, अब, यदि आप एक फ़ाइल को स्थानांतरित करना, चलो एक फ़ोल्डर मान लीजिए की जरूरत है आगे उदाहरण:

जड़/अनुप्रयोग/plugins/Utils

सिर्फ inlucde require_once '../../../app-config.php';

स्पष्ट रूप से मैं था लगता है टी आप प्रत्येक बार पथ नहीं बदल रहे हैं =) वैसे भी अगर आपको ऐसा करने की ज़रूरत है तो सैकड़ों के बजाय एक फ़ाइल समावेशन को बदलने के लिए हमेशा आसान होता है।

आशा आप को यह कर भावना =)

+0

मैं अभी इस समाधान को लागू कर रहा हूं। धन्यवाद। –

1

अपने उपयोग पर निर्भर करता है, धारण करने के लिए आवेदन पथ आम बात

चर यह अपने आवेदन में कहीं ओवरराइड हो सकता है के रूप में और अपने आवेदन तोड़ सकते हैं

है का उपयोग न करें में से एक है एक निरंतर परिभाषित >/घर/20111202000000, जबकि स्थिर ver रखने - यहां तक ​​कि सिमलिंक के साथ गठबंधन करने के लिए

application dirs 
=============================== 
/home/latest   -> symlink 
/home/testing  -> symlink 
/home/20111202000000 -> latest development version 
/home/20111201000000 -> yesterday stable release 

तो, आप प्रतीकात्मक कड़ी
/घर/परीक्षण कर सकते हैं (प्रतीकात्मक शाखाओं बनाने के लिए) बेहतर सायन,
/घर/नवीनतम ->/घर/20111201000000

इस के साथ

लेंगे, तो आप कुछ परीक्षण/विकास कर अपने उत्पादन साइट को तोड़ने के लिए जोखिम की जरूरत नहीं है, और, आप आसानी से अपने विकास निर्देशिका बदल सकते हैं

+0

मुझे वास्तव में वास्तव में यह समाधान पसंद है। Symlinks का उपयोग करने के बारे में कभी सोचा नहीं। –

2

मैंने कुछ परियोजनाओं में देखा है कि लोग डायरनाम (फ़ाइल) का उपयोग करते हैं। इसका क्या मतलब है, मेरा मतलब है, क्यों न सिर्फ नाम छोड़ने के बाद इसे छोड़ दें (फ़ाइल कहां बैठती है) के आधार पर?

यह पथ शामिल करने के सापेक्ष है, वैसे भी। dirname(__FILE__) (या PHP में = __DIR__ PHP = = 5.3) वहां है ताकि आप प्रत्येक स्थान से फ़ाइल चला सकें। यदि आप सापेक्ष पथ का उपयोग कर रहे हैं, तो मान "।" बदल सकता है। देखें:

बेर @ बेर-पीसी: ~% बिल्ली so.php

<?php 
var_dump(realpath('.')); 
var_dump(realpath(__DIR__)); 

बेर @ बेर-पीसी: ~% php so.php

string(11) "/home/berry" 
string(11) "/home/berry" 

बेर @ बेरी-पीसी: ~% सीडी फू

बेरी @ बेरी-पीसी: ~/foo% php .. /so.php

string(15) "/home/berry/foo" 
string(11) "/home/berry" 

इसलिए, यह सापेक्ष है, लेकिन यह वर्तमान कार्यशील निर्देशिका के सापेक्ष है, है ना निर्देशिका फ़ाइल में स्थित है। यही कारण है कि आप इस के लिए __DIR__ का उपयोग करना चाहेंगे है। और जिस तरह से; हाँ, मैं फ़ाइलों को एक भयानक जगह के चारों ओर नहीं ले जाता। अगर मैं ऐसा करता हूं, तो मुझे उस फ़ाइल में प्रत्येक कॉल को अपडेट करना होगा, हालांकि मुझे अब एक भयानक लॉट की आवश्यकता नहीं है या नहीं, क्योंकि मैं Autoloader का उपयोग कर रहा हूं।

अन्य फ़ाइलों के लिए जो मैं संदर्भित कर रहा हूं (जैसे टेम्पलेट फाइलें), मैंने पथ को मैन्युअल रूप से सेट किया है, लेकिन एक बार। मैं फिर $path . '/filename.php'; का संदर्भ देता हूं, इसलिए बाद में बदलना आसान है।

+2

इस बहुत विस्तृत पोस्ट के लिए धन्यवाद। अब यह समझ में आता है। ऑटोलोड लोड भी बहुत साफ दिखता है। –

+0

@ फ्रैंकविला अधिक स्वागत है। –

0

ओपोड कैश या बहुत सारी आवश्यकता/समावेशन कथन का उपयोग करते समय निरपेक्ष पथ प्रदर्शन के दृष्टिकोण से बेहतर होते हैं (हालांकि जब आप सैकड़ों फाइलों को शामिल करना शुरू करते हैं तो यह केवल ध्यान देने योग्य होता है, जैसा कि ज़ेंड/Symfony/आदि)।

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

0

मैं हमेशा पूर्ण पथ का उपयोग करें, लेकिन मैं यह भी से निकाले गए मूल्यों पर आधारित है, एक बूटस्ट्रैप फ़ाइल जहाँ मैं सबसे अधिक इस्तेमाल किया स्थिरांक के रूप में पथ को परिभाषित के साथ किसी भी कस्टम पीएचपी परियोजना शुरू $_SERVER

यह वह जगह है मैं अपने रूट पथ कैसे परिभाषित:

define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]); 
define("HTTP_PATH_ROOT", isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : (isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : '_UNKNOWN_')); 

पथ LOCAL_PATH_ROOT दस्तावेज़ जड़ है। पथ HTTP_PATH_ROOT HTTP के माध्यम से एक ही पथ तक पहुंचने के बराबर है।

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path) 

आप विंडोज आधारित सर्वर के साथ संगतता सुनिश्चित करने के लिए चाहते हैं, तो आप निर्देशिका बदलने के लिए की आवश्यकता होगी:

उस समय, एक HTTP पथ के लिए किसी भी स्थानीय पथ परिवर्तित करने के लिए निम्न कोड के साथ किया जा सकता है साथ ही एक यूआरएल विभाजक के साथ विभाजक:

:

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, str_replace(DIRECTORY_SEPARATOR, '/', $my_path)) 

यहाँ है कि मैं PHP PowerTools boilerplate के लिए उपयोग कर रहा हूँ पूर्ण बूटस्ट्रैप कोड है

आप अपने खुद के परियोजना के लिए ऊपर दिए गए कोड जोड़ दें, तो इस बिंदु (जो get_defined_constants(true) साथ कर सकते हैं पर सभी उपयोगकर्ता स्थिरांक outputting एक परिणाम है कि इस तरह कुछ हद तक लग रहा है देना चाहिए:

array (
    'LOCAL_PATH_BOOTSTRAP' => '/var/www/libraries/backend/Data/examples', 
    'URL_SEPARATOR' => '/', 
    'DS' => '/', 
    'PS' => ':', 
    'US' => '/', 
    'RELATIVE_PATH_ROOT' => '', 
    'LOCAL_PATH_ROOT' => '/var/www', 
    'HTTP_PATH_ROOT' => 'localhost:8888', 
    'RELATIVE_PATH_BASE' => '/libraries/backend/Data/examples', 
    'RELATIVE_PATH_APP' => '/libraries/backend/Data', 
    'RELATIVE_PATH_LIBRARY' => '/libraries/backend/Data/vendor', 
    'RELATIVE_PATH_HELPERS' => '/libraries/backend/Data/examples', 
    'RELATIVE_PATH_TEMPLATE' => '/libraries/backend/Data/examples/templates', 
    'RELATIVE_PATH_CONFIG' => '/libraries/backend/Data/examples/config', 
    'RELATIVE_PATH_PAGES' => '/libraries/backend/Data/examples/pages', 
    'RELATIVE_PATH_ASSET' => '/libraries/backend/Data/examples/assets', 
    'RELATIVE_PATH_ASSET_IMG' => '/libraries/backend/Data/examples/assets/img', 
    'RELATIVE_PATH_ASSET_CSS' => '/libraries/backend/Data/examples/assets/css', 
    'RELATIVE_PATH_ASSET_JS' => '/libraries/backend/Data/examples/assets/js', 
    'LOCAL_PATH_BASE' => '/var/www/libraries/backend/Data/examples', 
    'LOCAL_PATH_APP' => '/var/www/libraries/backend/Data', 
    'LOCAL_PATH_LIBRARY' => '/var/www/libraries/backend/Data/vendor', 
    'LOCAL_PATH_HELPERS' => '/var/www/libraries/backend/Data/examples', 
    'LOCAL_PATH_TEMPLATE' => '/var/www/libraries/backend/Data/examples/templates', 
    'LOCAL_PATH_CONFIG' => '/var/www/libraries/backend/Data/examples/config', 
    'LOCAL_PATH_PAGES' => '/var/www/libraries/backend/Data/examples/pages', 
    'LOCAL_PATH_ASSET' => '/var/www/libraries/backend/Data/examples/assets', 
    'LOCAL_PATH_ASSET_IMG' => '/var/www/libraries/backend/Data/examples/assets/img', 
    'LOCAL_PATH_ASSET_CSS' => '/var/www/libraries/backend/Data/examples/assets/css', 
    'LOCAL_PATH_ASSET_JS' => '/var/www/libraries/backend/Data/examples/assets/js', 
    'HTTP_PATH_BASE' => 'localhost:8888/libraries/backend/Data/examples', 
    'HTTP_PATH_APP' => 'localhost:8888/libraries/backend/Data', 
    'HTTP_PATH_LIBRARY' => false, 
    'HTTP_PATH_HELPERS' => false, 
    'HTTP_PATH_TEMPLATE' => false, 
    'HTTP_PATH_CONFIG' => false, 
    'HTTP_PATH_PAGES' => false, 
    'HTTP_PATH_ASSET' => 'localhost:8888/libraries/backend/Data/examples/assets', 
    'HTTP_PATH_ASSET_IMG' => 'localhost:8888/libraries/backend/Data/examples/assets/img', 
    'HTTP_PATH_ASSET_CSS' => 'localhost:8888/libraries/backend/Data/examples/assets/css', 
    'HTTP_PATH_ASSET_JS' => 'localhost:8888/libraries/backend/Data/examples/assets/js', 
    'REQUEST_QUERY' => false, 
    'REQUEST_METHOD' => 'GET', 
    'REQUEST_STATUS' => false, 
    'REQUEST_PROTOCOL' => 'http://', 
    'REQUEST_PATH' => '/', 
    'REQUEST_PATH_STRIP_QUERY' => '/', 
    'PRODUCTION' => false, 
    'PAGE_PATH_DEFAULT' => '/index', 
    'PAGE_PATH' => '/index', 
) 
संबंधित मुद्दे