2010-10-17 34 views
22

Tôi đang gặp sự cố với các tệp bao gồm của mình. Tôi không có vẻ để có thể tìm ra cách để xây dựng các URL của tôi khi tôi sử dụng require_once ('somefile.php'). Nếu tôi cố gắng sử dụng tệp bao gồm ở nhiều nơi trong đó cấu trúc thư mục khác nhau, tôi gặp lỗi khi không thể tìm thấy tệp bao gồm.PHP cách tìm gốc ứng dụng?

Trong asp.net, để lấy đường dẫn gốc của ứng dụng, tôi có thể sử dụng ~/directory/file.aspx. Dấu gạch chéo ở phía trước luôn luôn biết rằng tôi đang tham chiếu từ gốc trang web của tôi và tìm tệp bất kể yêu cầu đến từ đâu trong trang web của tôi. Nó luôn luôn đề cập đến thư mục gốc và tìm kiếm tập tin từ đó.

CÂU HỎI: Tôi làm cách nào để có được đường dẫn gốc của trang web? Làm thế nào tôi có thể làm điều này để tôi có thể sử dụng lại các tệp bao gồm của tôi từ bất kỳ đâu trong trang web của mình? Tôi có phải sử dụng đường dẫn tuyệt đối trong URL của mình không?

Cảm ơn bạn!

+2

URL xây dựng không liên quan gì đến require_once. URL không phải là tệp. –

+0

Bạn đang sử dụng phiên bản PHP nào và cấu trúc hệ thống tệp của bạn trông như thế nào? – Petah

Trả lời

20

$_SERVER['DOCUMENT_ROOT'] cần có đường dẫn gốc tới máy chủ web của bạn.

Chỉnh sửa: Nếu bạn xem xét hầu hết các chương trình php chính. Khi sử dụng trình cài đặt, bạn thường nhập vào đường dẫn đầy đủ đến thư mục ứng dụng. Trình cài đặt sẽ chỉ đặt trong tệp cấu hình được bao gồm trong toàn bộ ứng dụng. Một tùy chọn là sử dụng auto prepend file để đặt biến. tùy chọn khác chỉ là include_once() tệp cấu hình trên mọi trang bạn cần. Tùy chọn cuối cùng tôi sẽ đề nghị là viết cho bạn ứng dụng bằng cách sử dụng bootstrapping là nơi bạn phễu tất cả các yêu cầu thông qua một tệp (thường là với url_rewrite). Điều này cho phép bạn dễ dàng thiết lập/bao gồm các biến cấu hình ở một chỗ và có sẵn chúng trong tất cả các tập lệnh.

+0

Trên máy phát triển của tôi usi ng WampServer Tôi nhận được C:/wamp/www/khi tôi sử dụng $ _SERVER ['DOCUMENT_ROOT']. Tuy nhiên trang web của tôi nằm trong C:/wamp/www/mysite /. Nếu trang web của tôi được lưu trữ trên máy chủ trực tiếp như máy chủ chia sẻ, tôi sẽ nhận được gì khi sử dụng $ _SERVER ['DOCUMENT_ROOT']? –

+0

là mysite có phải là máy chủ ảo không? – koen

+1

Điều này xảy ra vì gốc ứng dụng thực tế là C:/wamp/www và bạn lưu trữ mã trong thư mục con của thư mục này. Bạn có thể muốn thay đổi gốc tài liệu cho dự án này hoặc tạo biến (const MY_APP_ROOT = ... –

-2

Hãy thử điều này:

$_SERVER['DOCUMENT_ROOT'] 
+0

Không - OP tìm kiếm URL cơ sở, không phải đường dẫn tệp –

+1

@Scott Thực tế, chỉ sử dụng biến này là tải tệp bao gồm –

+0

Đúng: hoạt động tốt, ở đây – winwaed

-1

Bạn nên sử dụng được xây dựng trong các hằng số ma thuật để tìm tập tin. __FILE____DIR__. Nếu bạn đang sử dụng PHP < 5.3, bạn nên sử dụng dirname(__FILE__)

Ví dụ:

require_once __DIR__.'/../../include_me.php'; 

$_SERVER['DOCUMENT_ROOT'] không phải lúc nào cũng đảm bảo trả lại những gì bạn mong đợi.

+0

điều này sẽ không hoạt động trong các subdirs –

+0

Tại sao nó không hoạt động trong các thư mục con? 'require_once __DIR __. '/ i/am/a/sub/dir.php' – Petah

+0

Rất tiếc, không có giải pháp nào trong số này có hiệu quả. $ _SERVER ['DOCUMENT_ROOT'] đến gần nhất với các giải pháp nhưng nó không tải bao gồm các tệp. –

-1

Xác định nó trong tệp cấu hình ở đâu đó.

Giả sử bạn đang sử dụng một phong cách MVC nơi mà mọi thứ được chuyển qua một index.php đơn sau đó

realpath('.'); 

sẽ cho bạn thấy những đường dẫn đến thư mục làm việc hiện hành (chỉ số tức là ở đâu.php là)

Vì vậy, sau đó bạn có thể định nghĩa này như

define('PROJECT_ROOT', realpath('.')); 

Nếu nó không phải là MVC và bạn cần nó để làm việc cho các tập tin trong thư mục con thì bạn có thể mã chỉ cứng nó trong một tập tin cấu hình

define('PROJECT_ROOT', 'C:/wamp/www/mysite'); 

Sau đó, khi bao gồm thứ gì đó bạn có thể làm;

include PROJECT_ROOT . '/path/to/include.php'; 
-1

Bạn có thể Alternativly thiết lập các thư mục cơ sở trong tập tin .htaccess bạn

SetEnv BASE_PATH C:/wamp/www/mysite/ 

Sau đó trong PHP bạn có thể tham khảo nó với $_SERVER['BASE_PATH']

+0

Tại sao tất cả sự thù ghét? – Petah

8

Tôi thường lưu trữ config.php tập tin trong ROOT thư mục, và trong config.php Tôi viết:

define('ROOT_DIR', __DIR__);

Và sau đó chỉ sử dụng ROOT_DIR không đổi trong tất cả các tập lệnh khác. Sử dụng $_SERVER['DOCUMENT_ROOT'] không phải là rất tốt vì:

  • Nó phải lúc nào cũng phù hợp với mục ROOT_DIR
  • Biến này không có sẵn trong CGI chế độ (ví dụ: nếu bạn chạy các kịch bản của bạn bằng cách CRON)
+4

để sử dụng hằng số ROOT_DIR trong tất cả các tập lệnh khác, bạn phải đưa tệp chứa nó vào tất cả các tập lệnh khác. Vì vậy, cùng một vấn đề một lần nữa. –

+1

Có, nhưng ít nhất bạn chỉ có thể sử dụng: include (ROOT_DIR. '/ Known/path/to/file.php'); Thay vì sử dụng một cái gì đó như: $ ROOT = '../../../'; (mà phải thay đổi trong mỗi thư mục con), nhưng sau đó bạn phải lo lắng về việc toàn cầu hóa $ ROOT mọi lúc. – AVProgrammer

+0

Tôi nghĩ là một cách tốt hơn mảng $ _Server – HAROONMIND

0

Thật tuyệt khi có thể sử dụng cùng một mã ở đầu mỗi tập lệnh và biết rằng trang của bạn sẽ tải đúng cách, ngay cả khi bạn đang ở trong thư mục phụ. Tôi sử dụng này, dựa vào bạn không biết những gì thư mục gốc của bạn được gọi (thông thường, 'htdocs' hoặc 'public_html':

defined('SITEROOT') or define('SITEROOT', substr($_SERVER['DOCUMENT_ROOT'], 0, strrpos($_SERVER['DOCUMENT_ROOT'], 'public_html')) . 'public_html'); 

Với SITEROOT được xác định một cách nhất quán, bạn có thể truy cập vào một tập tin cấu hình và/hoặc các thành phần trang mà không điều chỉnh đường dẫn trên cơ sở từng tập lệnh, chẳng hạn như tệp cấu hình được lưu trữ bên ngoài thư mục gốc của bạn:

require_once SITEROOT . "/../config.php"; 
Các vấn đề liên quan