2013-07-01 14 views
41

İçerisinde /root/update/test.php dosyasına sahibim. Ayrıca bir dosya var, /root/connect.php; Bu dosyada /root/update/test.php dosyasındaPHP, göreceli yol

bulunmaktadır. Ben /root/update/test.php çalıştırdığınızda, bu benim için kafa karıştırıcı bana

PHP Warning: include(../config.php): failed to open stream: No such file or directory in /root/connect.php on line 2 
PHP Warning: include(): Failed opening '../config.php' for inclusion (include_path='.:/root') 

vererek connect.php bulur ama config.php bulamazsa

set_include_path(".:/root"); 
include "connect.php"; 

kodu var çünkü uyarılar, her şeyi doğru şekilde yaptığımı gösteriyor - içerme yolu/root, ve var olan ../config.php (/config.php) dosyasını arıyor. Birisi bunu benim için temizleyebilir mi? Mutlak yolların kullanılmasının, benim erişemediğim bir üretim sunucusuna dağıtılmasından dolayı benim için bir seçenek olmadığını unutmayın. Ubuntu/Apache

+0

/root/update/olan ve /root/config.php için – user4035

+0

aramasını yaptığınız CWD'nize göre config.php'yi eklemeyi denerim. Bu: "../config.php" ifadesini içeren klasöre kök klasörün üst öğesidir. Config.php burada mı? – Gimmy

+0

config.php dosyasının tam yolu nedir? – meiamsome

cevap

83

elde edilebilecek her zaman o __DIR__ kullanarak şunları içerebilir:

include(dirname(__DIR__).'/config.php'); 

__DIR__ 'sihirli' ve iadeler ise Geçerli dosyanın dizini, izleyen eğik çizgi olmadan. Aslında mutlak bir yol, dosya adını __DIR__ ile birleştirmeniz gerekiyor. Bu durumda, bir dizini yükseltmemiz gerektiği için, dosya ağacına çıkan ve buradan config.php'a erişebilen PHP'nin dirname'unu kullanıyoruz.

Sen de bu yöntemde kök yolunu ayarlayabilirsiniz: test.php içinde

define('ROOT_PATH', dirname(__DIR__) . '/'); 

/root/ seviyesinde olacak şekilde kök ayarlarsınız. Daha sonra, yapılandırma dosyasını istediğiniz yerden eklemek için çalışmalıdır. İşte

+3

Bu sabitleri göreceli yollarla kullanmayı planlıyorsanız (ör. ../), Define() 'den önce realpath() ile temizlemenizi öneririm. –

+1

'ROOT_PATH. '.. /'' yerine 'dirname (ROOT_PATH)' yi kullanırdım. İkincisi size "daha mutlak" bir yol verecektir. – Kayla

+0

Bu sık hata için bir sorun giderme kontrol listesi başlattım: stackoverflow.com/a/36577021/2873507 –

1

Sana mutlak yolları inanıyoruz takdir ederken

o göreli yollar ve PHP güncellenmesi daha iyi bir seçenektir yolu dahil olduğunu bir seçenek değildir.

Çevreye göre ayarlayabileceğiniz bir sabit ile mutlak yollar kullanın. yorumladığı gibi

if (is_production()) { 
    define('ROOT_PATH', '/some/production/path'); 
} 
else { 
    define('ROOT_PATH', '/root'); 
} 

include ROOT_PATH . '/connect.php'; 

, ROOT_PATH da vb akım yolu, $_SERVER['DOCUMENT_ROOT'],

+0

'define ('ROOT_PATH', __DIR __. '/ .. /'); ', belki? – meiamsome

+1

Bu kesinlikle iyi bir öneri ve kesinlikle çalışıyor - ama __DIR__ daha fazla aradığım şey. (Downvoter değilim) –

+0

Bu sık hata için bir sorun giderme denetim listesi başlattım: stackoverflow.com/a/36577021/2873507 –

0
function relativepath($to){ 
    $a=explode("/",$_SERVER["PHP_SELF"]); 
    $index= array_search("$to",$a); 
    $str=""; 
    for ($i = 0; $i < count($a)-$index-2; $i++) { 
     $str.= "../"; 
    } 
    return $str; 
    } 

sadece hangi noktada durdurmak istiyor seviyeye belirtmek gerekir, ben bu konuda yapılmış en iyi çözümdür, ama sorun bu klasör Adı bir defa kullanmak zorunda olmasıdır.

İlgili konular