Bir PHP projesinin Kök Dizin Yolunu Alın


115

PHP projemde bu klasör yapısına sahibim. (bu tutulmalarda gösterildiği gibidir)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources

Bu kodu denediğimde

echo $_SERVER['DOCUMENT_ROOT']

çıktı

D: / çalışma

MySystemKlasör Adını kodlamadan sistemin ( ) RootDirectory yolunu nasıl alabilirim ?

Yanıtlar:


146

İçin PHP> = 5.3.0 denemede

PHP sihirli sabitleri .

__DIR__

Ve yolunuzu göreceli yapın.

For PHP <5.3.0 denemede

dirname(__FILE__)

3
bu harika, $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] vb. denedim ama mükemmel bir şekilde çalıştı!
webblover

79
Nereyi kullandığınıza bağlıdır __DIR__ . Dosyanın kendisine bağlıdır, bu nedenle bir alt dizinin içindeyse, yalnızca kök dizininizi döndürmez.
Iris

11
Kök dizini vermeyecek
inrsaurabh

1
Bu cevaba rastlayanlar için sorulan sorunun cevabını arayanlar için hızlı bir not, DIR , siz onu proje kökünde olan bir dosyada çağırmadığınız sürece proje kökünü değil, mevcut dosyanın dizinini alır, ancak php'nin yapmadığı gibi bir proje konseptine sahip olmak, tüm yollar mutlak veya mevcut konuma göre olmak zorundadır
MikeT

Lütfen size yardımcı olduğu için soruyu doğru şekilde yanıtlamayan bir yanıta oy vermeyin.
ElYeante

73

Bunu söylediğinde

$_SERVER['DOCUMENT_ROOT']

bu yolu içerir:

D:/workspace

O zaman D:aradığınız şey bu, değil mi? Bu durumda, dizeyi eğik çizgilerle patlatabilir ve ilkini döndürebilirsiniz:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

Bu, sunucunun kök dizinini çıkaracaktır.

Güncelleme: Sabit DIRECTORY_SEPARATORkodlanmış eğik çizgi ( '/') yerine sabiti kullandığınızda, bu kod Windows altında da çalışır.

2 güncelle:$_SERVER Küresel değişken her zaman mevcut değildir. Örneğin komut satırında (cli). Yani __DIR__bunun yerine kullanmalısınız $_SERVER['DOCUMENT_ROOT']. __DIR__php dosyasının kendi yolunu döndürür.


2
Bunun __DIR__yerine kullanabilirsiniz $_SERVER['DOCUMENT_ROOT'].
Armin

Üzgünüm, sorumu doğru bir şekilde açıklamadıysam, aslında ihtiyacım olan şey 'D: / workspace / MySystem'
Nalaka526

1
kök dizin yolunuz / var / public / www "biçimindeyse, bu yöntemi kullandığınızda dizideki ilk dize boş (0) / (1) / (2) / (3) olacaktır. kök ikinci dize $ pathInPieces [1]
tbradley22


9

Wordpress'in bunu nasıl ele aldığına işaret etmek istiyorum:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );

Wordpress tüm web'de çok yoğun kullanıldığından ve yerel olarak da iyi çalıştığından bu yönteme çok güveniyorum.


1
Sanırım bu yalnızca iki dizin düzeyiniz olduğunda işe yarar. Sağ? Yani, base_project_directory / klasör1 / klasör2 / klasör3 / dosya.php'den çağrıldığında, base_project_dizini döndürmez.
Ali Khalili

"Wordpress web'de çok yoğun kullanıldığından ve yerel olarak da iyi çalıştığından, bu yönteme çok güveniyorum." WP kod kalitesi ve güvenlik geçmişi göz önüne alındığında bunun özellikle iyi bir argüman olduğuna inanmıyorum.
Alex Barker

1
@AlexBarker WP'nin kötü bir güvenlik geçmişine sahip olduğunu ima ettiğiniz gerçeğine itiraz ediyorum. Aslında oldukça güvenlidir ve güvenliğe odaklanmış bir yanıt ekibi vardır - çekirdek, son yıllarda çok az sayıda güvenlik sorunu yaşadı (yorum yaptığınız zamanki dahil).
William Patton

3

deneyebilirsin: $_SERVER['PATH_TRANSLATED']

alıntı:

Sunucu sanaldan gerçeğe herhangi bir eşleme yaptıktan sonra, geçerli betiğe dosya sistemi (belge kökü değil) tabanlı yol. Not: PHP 4.3.2'den itibaren, PATH_TRANSLATEDApache SCRIPT_FILENAMEtarafından doldurulmadığında sunucu değişkeniyle aynı değere ayarlandığı Apache 1'deki durumun aksine, Apache 2 SAPI altında artık örtük olarak ayarlanmamaktadır .
Bu değişiklik, PATH_TRANSLATED'ın yalnızca PATH_INFOtanımlanmışsa var olması gereken CGI spesifikasyonuna uymak için yapıldı . Apache 2 kullanıcıları AcceptPathInfo = Oniçini httpd.conftanımlamak için kullanabilirPATH_INFO

kaynak: php.net/manual


1
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;

0

özet

Bu örnek, apache kök klasörünün '/ var / www /' nerede olduğunu her zaman bildiğinizi ve sonraki klasör yolunu bulmaya çalıştığınızı varsayar (örn. '/ Var / www / my_website_folder'). Ayrıca bu, bir komut dosyası veya web tarayıcısından çalışır, bu nedenle ek kod vardır.

Kod PHP7

function getHtmlRootFolder(string $root = '/var/www/') {

    // -- try to use DOCUMENT_ROOT first --
    $ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
    $ret = rtrim($ret, '/') . '/';

    // -- if doesn't contain root path, find using this file's loc. path --
    if (!preg_match("#".$root."#", $ret)) {
      $root = rtrim($root, '/') . '/';
      $root_arr = explode("/", $root);
      $pwd_arr = explode("/", getcwd());
      $ret = $root . $pwd_arr[count($root_arr) - 1];
    }

    return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}

Misal

echo getHtmlRootFolder();

Çıktı:

/var/www/somedir/

Detaylar:

Temel olarak ilk önce DOCUMENT_ROOT '/ var / www /' içeriyorsa, sonra onu kullanmaya çalışır, aksi takdirde mevcut dizini (projenin içinde çoğu var olan) alır ve $ kök yolunun sayısına bağlı olarak bir sonraki yol değerini alır. Not: her durumda '/' ile biten yolun döndürülmesini sağlamak için rtrim ifadeleri eklendi. / Var / www / 'dan daha büyük olması gerekip gerekmediğini kontrol etmez, ayrıca olası bir yanıt olarak / var / www / döndürebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.