Dapatkan Jalur Direktori Akar dari proyek PHP

115

Saya memiliki struktur folder ini dalam proyek PHP saya. (ini seperti yang ditunjukkan pada gerhana)

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

Saat saya mencoba kode ini

echo $_SERVER['DOCUMENT_ROOT']

keluarannya

D: / ruang kerja

Bagaimana saya bisa mendapatkan jalur ke RootDirectory sistem ( MySystem), tanpa hardcode Nama Folder?

Nalaka526
sumber

Jawaban:

146

Untuk PHP> = 5.3.0 coba

Konstanta ajaib PHP .

__DIR__

Dan buat jalanmu relatif.

Untuk PHP <5.3.0 coba

dirname(__FILE__)
Prasad Rajapaksha
sumber
3
ini luar biasa, saya mencoba $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] dll. tetapi ini bekerja dengan sangat baik!
webblover
78
Itu tergantung di mana Anda menggunakannya __DIR__ . Ini relatif terhadap file itu sendiri, jadi jika di include, di dalam sub direktori, itu tidak akan mengembalikan hanya direktori root Anda.
Iris
10
Ini tidak akan memberikan direktori root
inrsaurabh
1
catatan singkat untuk siapa saja yang menemukan jawaban ini mencari jawaban dari pertanyaan yang diajukan, DIR mendapatkan direktori file saat ini bukan root proyek kecuali Anda memanggilnya dalam file yang ada di root proyek, tetapi karena php tidak memiliki konsep proyek semua jalur harus mutlak atau relatif terhadap lokasi saat ini
MikeT
Harap jangan memberi suara positif pada jawaban yang tidak menjawab pertanyaan dengan benar, hanya karena membantu Anda.
ElYeante
73

Saat kamu mengatakan itu

$_SERVER['DOCUMENT_ROOT']

berisi jalur ini:

D:/workspace

Lalu D:apa yang Anda cari, bukan? Dalam hal ini Anda dapat meledakkan string dengan garis miring dan mengembalikan yang pertama:

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

Ini akan menampilkan direktori root server.

Pembaruan: Saat Anda menggunakan konstanta, DIRECTORY_SEPARATORbukan garis miring yang di-hardcode ( '/'), kode ini juga berfungsi di bawah Windows.

Memperbarui 2: The $_SERVERvariabel global tidak selalu tersedia. Pada baris perintah (cli) misalnya. Jadi, Anda harus menggunakan __DIR__bukan $_SERVER['DOCUMENT_ROOT']. __DIR__mengembalikan jalur file php itu sendiri.

Armin
sumber
2
Dan Anda bisa menggunakan __DIR__bukan $_SERVER['DOCUMENT_ROOT'].
Armin
Maaf Jika saya belum menjelaskan pertanyaan saya dengan benar, Yang sebenarnya saya butuhkan adalah 'D: / workspace / MySystem'
Nalaka526
1
jika path direktori root Anda dalam bentuk / var / public / www "maka menggunakan metode ini string pertama dalam array akan kosong (0) / (1) / (2) / (3). root akan menjadi string kedua $ pathInPieces [1]
tbradley22
36

gunakan fungsi PHP:

getcwd()

Mendapat direktori kerja saat ini.

dkinzer.dll
sumber
1
Ini mengembalikan jalur file yang sedang dijalankan SAAT INI. Bukan jalur root
Yousha Aleayoub
9

Saya ingin menunjukkan cara Wordpress menangani ini:

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

Karena Wordpress sangat berat digunakan di seluruh web dan juga berfungsi dengan baik secara lokal, saya sangat percaya pada metode ini.

Hexodus
sumber
1
Saya kira ini hanya berfungsi ketika Anda memiliki dua tingkat direktori. Baik? Maksud saya, ketika memanggilnya dari base_project_directory / folder1 / folder2 / folder3 / file.php itu tidak mengembalikan base_project_directory.
Ali Khalili
"Karena Wordpress sangat berat digunakan di seluruh web dan juga berfungsi dengan baik secara lokal, saya sangat percaya pada metode ini." Saya tidak percaya ini adalah argumen yang sangat bagus mengingat kualitas kode WP dan rekam jejak keamanan.
Alex Barker
1
@AlexBarker Saya akan membantah fakta yang Anda nyatakan bahwa WP memiliki rekam jejak keamanan yang buruk. Ini sebenarnya cukup aman dan memiliki tim respinsive yang berfokus pada keamanan - core memiliki sangat sedikit masalah keamanan yang dieksploitasi dalam beberapa tahun terakhir (termasuk sejauh Anda berkomentar).
William Patton
3

Anda dapat mencoba: $_SERVER['PATH_TRANSLATED']

mengutip:

Jalur berbasis filesystem- (bukan dokumen root-) ke skrip saat ini, setelah server melakukan pemetaan virtual-ke-nyata. Catatan: Mulai dari PHP 4.3.2, PATH_TRANSLATEDtidak lagi diatur secara implisit di bawah Apache 2 SAPI berbeda dengan situasi di Apache 1, di mana ia disetel ke nilai yang sama dengan SCRIPT_FILENAMEvariabel server ketika tidak diisi oleh Apache.
Perubahan ini dibuat untuk memenuhi spesifikasi CGI bahwa PATH_TRANSLATED seharusnya hanya ada jika PATH_INFOditentukan. Pengguna Apache 2 dapat menggunakan AcceptPathInfo = Oninside httpd.confuntuk mendefinisikanPATH_INFO

sumber: php.net/manual

Ini saya
sumber
1
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
Waqar Alamgir
sumber
0

Ringkasan

Contoh ini mengasumsikan Anda selalu tahu di mana folder root apache adalah '/ var / www /' dan Anda mencoba mencari jalur folder berikutnya (misalnya '/ var / www / my_website_folder'). Ini juga berfungsi dari skrip atau browser web, itulah sebabnya ada kode tambahan.

Kode 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;
}

Contoh

echo getHtmlRootFolder();

Keluaran:

/var/www/somedir/

Rincian:

Pada dasarnya pertama-tama mencoba untuk mendapatkan DOCUMENT_ROOT jika itu berisi '/ var / www /' kemudian gunakan, jika tidak, dapatkan dir saat ini (yang banyak ada di dalam proyek) dan dapatkan nilai jalur berikutnya berdasarkan jumlah jalur $ root. Catatan: menambahkan pernyataan rtrim untuk memastikan jalur kembali diakhiri dengan '/' dalam semua kasus. Itu tidak memeriksa apakah itu membutuhkan lebih besar dari / var / www / itu juga dapat mengembalikan / var / www / sebagai respons yang memungkinkan.

Mike Q
sumber