Nhận đường dẫn thư mục gốc của một dự án PHP


115

Tôi có cấu trúc thư mục này trong dự án PHP của mình. (điều này được hiển thị trong nhật thực)

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

Khi tôi thử mã này

echo $_SERVER['DOCUMENT_ROOT']

đầu ra là

D: / không gian làm việc

Làm cách nào tôi có thể lấy đường dẫn đến RootDirectory của hệ thống ( MySystem) mà không cần mã hóa cứng Tên thư mục?

Câu trả lời:


146

Đối với PHP> = 5.3.0 hãy thử

Hằng số ma thuật trong PHP .

__DIR__

Và làm cho con đường của bạn tương đối.

Đối với PHP <5.3.0 hãy thử

dirname(__FILE__)

3
điều này thật tuyệt vời, tôi đã thử $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'], v.v. nhưng điều này hoạt động xuất sắc!
webblover

78
Nó phụ thuộc vào nơi bạn sử dụng __DIR__ . Nó liên quan đến chính tệp, vì vậy nếu trong thư mục bao gồm, bên trong thư mục con, nó sẽ không chỉ trả về thư mục gốc của bạn.
Iris

10
Nó sẽ không cung cấp thư mục gốc
inrsaurabh

1
lưu ý nhanh cho bất kỳ ai tình cờ gặp câu trả lời này đang tìm kiếm câu trả lời cho câu hỏi được hỏi, DIR nhận thư mục của tệp hiện tại không phải là thư mục gốc của dự án trừ khi bạn gọi nó trong một tệp nằm trong thư mục gốc của dự án, nhưng như php thì không có khái niệm về một dự án tất cả các con đường phải tuyệt đối hay tương đối so với vị trí hiện tại
MikeT

Vui lòng không ủng hộ một câu trả lời không giải quyết chính xác câu hỏi, chỉ vì nó giúp ích cho bạn.
ElYeante

73

Khi bạn nói điều đó

$_SERVER['DOCUMENT_ROOT']

chứa đường dẫn này:

D:/workspace

Sau đó D:là những gì bạn đang tìm kiếm, phải không? Trong trường hợp đó, bạn có thể làm nổ chuỗi bằng dấu gạch chéo và trả về chuỗi đầu tiên:

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

Thao tác này sẽ xuất ra thư mục gốc của máy chủ.

Cập nhật: Khi bạn sử dụng hằng số DIRECTORY_SEPARATORthay vì dấu gạch chéo cứng ( '/'), mã này cũng đang hoạt động trong Windows.

Cập nhật 2: Biến $_SERVERtoàn cục không phải lúc nào cũng có sẵn. Trên dòng lệnh (cli) chẳng hạn. Vì vậy, bạn nên sử dụng __DIR__thay vì $_SERVER['DOCUMENT_ROOT']. __DIR__trả về đường dẫn của chính tệp php.


2
Và bạn có thể sử dụng __DIR__thay thế $_SERVER['DOCUMENT_ROOT'].
Armin

Xin lỗi nếu tôi đã không giải thích câu hỏi của tôi đúng, Những gì tôi thực sự cần là 'D: / workspace / MySystem'
Nalaka526

1
nếu đường dẫn thư mục gốc của bạn có dạng / var / public / www "thì sử dụng phương pháp này, chuỗi đầu tiên trong mảng sẽ trống (0) / (1) / (2) / (3). thư mục gốc sẽ là chuỗi thứ hai $ pathInPieces [1]
tbradley22

36

sử dụng hàm PHP:

getcwd()

Nhận thư mục làm việc hiện tại.


1
Điều này trả về đường dẫn tệp thực thi CURRENT. Không phải đường dẫn gốc
Yousha Aleayoub

9

Tôi muốn chỉ ra cách Wordpress xử lý điều này:

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

Vì Wordpress được sử dụng rất nhiều trên khắp các trang web và cũng hoạt động tốt tại địa phương nên tôi rất tin tưởng vào phương pháp này.


1
Tôi đoán điều này chỉ hoạt động khi bạn có hai cấp thư mục. Đúng? Ý tôi là, khi gọi nó từ base_project_directory / folder1 / folder2 / folder3 / file.php, nó không trả về base_project_directory.
Ali Khalili

"Vì Wordpress được sử dụng rất nặng trên khắp các trang web và cũng hoạt động tốt tại địa phương nên tôi rất tin tưởng vào phương pháp này." Tôi không tin rằng đây là một lập luận đặc biệt tốt dựa trên hồ sơ theo dõi bảo mật và chất lượng mã WP.
Alex Barker

1
@AlexBarker Tôi sẽ phản đối việc bạn ngụ ý rằng WP có hồ sơ theo dõi bảo mật không tốt. Nó thực sự khá an toàn và có một đội ngũ chuyên nghiệp tập trung vào tính bảo mật - cốt lõi đã có rất ít vấn đề bảo mật bị khai thác trong những năm gần đây (kể cả khi bạn nhận xét).
William Patton

3

bạn co thể thử: $_SERVER['PATH_TRANSLATED']

Trích dẫn:

Đường dẫn dựa trên hệ thống tập tin (không phải tài liệu gốc-) đến tập lệnh hiện tại, sau khi máy chủ thực hiện bất kỳ ánh xạ ảo-thực nào. Lưu ý: Kể từ PHP 4.3.2, PATH_TRANSLATEDkhông còn được đặt ngầm trong Apache 2 SAPI trái ngược với tình huống trong Apache 1, nơi nó được đặt thành cùng giá trị với SCRIPT_FILENAMEbiến máy chủ khi nó không được Apache phổ biến.
Thay đổi này được thực hiện để tuân thủ đặc tả CGI mà PATH_TRANSLATED sẽ chỉ tồn tại nếu PATH_INFOđược xác định. Người dùng Apache 2 có thể sử dụng AcceptPathInfo = Onbên trong httpd.confđể xác địnhPATH_INFO

nguồn: php.net/manual


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

0

Tóm lược

Ví dụ này giả sử bạn luôn biết thư mục gốc apache là '/ var / www /' và bạn đang cố gắng tìm đường dẫn thư mục tiếp theo (ví dụ: '/ var / www / my_website_folder'). Ngoài ra, điều này hoạt động từ một tập lệnh hoặc trình duyệt web, đó là lý do tại sao có mã bổ sung.

Mã 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;
}

Thí dụ

echo getHtmlRootFolder();

Đầu ra:

/var/www/somedir/

Chi tiết:

Về cơ bản, trước tiên hãy thử lấy DOCUMENT_ROOT nếu nó chứa '/ var / www /' rồi sử dụng nó, nếu không thì lấy dir hiện tại (tồn tại nhiều trong dự án) và nhận giá trị đường dẫn tiếp theo dựa trên số lượng đường dẫn $ root. Lưu ý: các câu lệnh rtrim được thêm vào để đảm bảo đường dẫn trả về kết thúc bằng dấu '/' trong mọi trường hợp. Nó không kiểm tra nó yêu cầu lớn hơn / var / www / nó cũng có thể trả về / var / www / như một phản hồi có thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.