- Giới thiệu
- Sự khác biệt giữa các đường dẫn tuyệt đối và tương đối
- Con đường tuyệt đối
- Đường dẫn tương đối
- Tài liệu gốc
- Đường dẫn máy chủ web
- Kịch bản console. Điểm nhập cảnh duy nhất
- Các lệnh và hằng số PHP hữu ích
- Nhận xét (12)
Giới thiệu
Trang web của bạn tồn tại trong hai cõi cùng một lúc: thực tế và ảo.
Đối với khách truy cập trang web, nó hoàn toàn là một máy chủ ảo, theo nhiều cách khác với một máy chủ thực sự. Không có tập tin để bắt đầu. Tôi biết, lúc đầu thật khó tin, nhưng đó là một sự thật. Trong địa chỉ như //example.com/file.html, file.html không phải là một tệp. Đó là một phần của URI, một tài nguyên ảo. Có thể có hoặc không thể có một tệp thực sự với một cái tên như vậy, nhưng nó không quan trọng. Trình duyệt của bạn không thể biết điều đó và không cần. Tất cả những gì nó cần biết là một địa chỉ.virtual server, which in many ways is different from a real one. There are no files for starter. I know, it's hard to believe at first, but it's a fact. In the address like //example.com/file.html, file.html is not a file. It's a part of URI, a virtual resource. There could be or could be not a real file with such a name, but it doesn't matter. Your browser cannot know that, and don't need to. All it needs to know is an address.
Đối với nhà phát triển trang web, mặt khác, trang web của họ là một chương trình nhất định chạy trên một máy chủ cụ thể, trên máy tính rất thực với ổ cứng, tệp và thư mục. Và tập lệnh PHP của bạn, trong khi đọc các tệp dữ liệu hoặc bao gồm các tập lệnh khác, đang làm việc với các tệp thực sự tồn tại trên phương tiện vật lý.
Vì vậy, thuyết nhị nguyên này là gốc rễ của nhiều vấn đề.
Người dùng PHP đã nhầm lẫn các vấn đề này lúc đầu, làm những việc như không thể xác định được một tệp hiện có, gây nhầm lẫn các siêu liên kết với các tệp, bao gồm các tệp cục bộ thông qua HTTP và như vậy.
Tuy nhiên, để sắp xếp những thứ này tất cả những gì bạn cần là chỉ nắm bắt hai khái niệm đơn giản:
- Sự khác biệt giữa các đường dẫn tuyệt đối và tương đối.absolute and relative paths.
- Sự khác biệt giữa gốc của máy chủ web và gốc hệ thống tập tin.root of the web server and the filesystem root.
Sự khác biệt giữa các đường dẫn tuyệt đối và tương đối
Con đường tuyệt đối
- Đường dẫn tương đốiroot, it is called absolute.
- Tài liệu gốcrelative (which makes sense, as it is relative to our present position)
Đường dẫn máy chủ web
Kịch bản console. Điểm nhập cảnh duy nhất
Con đường tuyệt đối
Đường dẫn tương đối
Tài liệu gốc
/var/www/site/forum/index.php/img/frame.gif
C:\windows\command.com
Đường dẫn máy chủ web
Kịch bản console. Điểm nhập cảnh duy nhất
Các lệnh và hằng số PHP hữu ích
Nhận xét (12)
- Trang web của bạn tồn tại trong hai cõi cùng một lúc: thực tế và ảo.
- Đối với khách truy cập trang web, nó hoàn toàn là một máy chủ ảo, theo nhiều cách khác với một máy chủ thực sự. Không có tập tin để bắt đầu. Tôi biết, lúc đầu thật khó tin, nhưng đó là một sự thật. Trong địa chỉ như //example.com/file.html, file.html không phải là một tệp. Đó là một phần của URI, một tài nguyên ảo. Có thể có hoặc không thể có một tệp thực sự với một cái tên như vậy, nhưng nó không quan trọng. Trình duyệt của bạn không thể biết điều đó và không cần. Tất cả những gì nó cần biết là một địa chỉ.
- Đối với nhà phát triển trang web, mặt khác, trang web của họ là một chương trình nhất định chạy trên một máy chủ cụ thể, trên máy tính rất thực với ổ cứng, tệp và thư mục. Và tập lệnh PHP của bạn, trong khi đọc các tệp dữ liệu hoặc bao gồm các tập lệnh khác, đang làm việc với các tệp thực sự tồn tại trên phương tiện vật lý.
Đường dẫn tương đối
Tài liệu gốc
Đường dẫn máy chủ web
Kịch bản console. Điểm nhập cảnh duy nhất
- Các lệnh và hằng số PHP hữu ích
- Nhận xét (12)
- Trang web của bạn tồn tại trong hai cõi cùng một lúc: thực tế và ảo.
- Đối với khách truy cập trang web, nó hoàn toàn là một máy chủ ảo, theo nhiều cách khác với một máy chủ thực sự. Không có tập tin để bắt đầu. Tôi biết, lúc đầu thật khó tin, nhưng đó là một sự thật. Trong địa chỉ như //example.com/file.html, file.html không phải là một tệp. Đó là một phần của URI, một tài nguyên ảo. Có thể có hoặc không thể có một tệp thực sự với một cái tên như vậy, nhưng nó không quan trọng. Trình duyệt của bạn không thể biết điều đó và không cần. Tất cả những gì nó cần biết là một địa chỉ.
Đối với nhà phát triển trang web, mặt khác, trang web của họ là một chương trình nhất định chạy trên một máy chủ cụ thể, trên máy tính rất thực với ổ cứng, tệp và thư mục. Và tập lệnh PHP của bạn, trong khi đọc các tệp dữ liệu hoặc bao gồm các tập lệnh khác, đang làm việc với các tệp thực sự tồn tại trên phương tiện vật lý.always builds it up to the absolute one. Both web-server and file system are doing that but different ways. So, let's learn them.
Tài liệu gốc
Đây là phần thú vị nhất. Có một điểm mà thế giới thực gặp thế giới ảo.
Hãy tưởng tượng có một tập tin như http://www.example.com/about/info.php
and
http://www.example.com/job/vacancy.php7. Trong khi trên máy chủ web địa chỉ của nó là http://www.example.com/about/info.php
and
http://www.example.com/job/vacancy.php8
Và ở đây, điểm có thể được thấy rõ: có một phần, phổ biến cho cả hai địa chỉ: http://www.example.com/about/info.php
and
http://www.example.com/job/vacancy.php9, đó là nguồn gốc của sự nhầm lẫn.
Đối với trình duyệt, đường dẫn này hoàn toàn tuyệt đối, bắt đầu từ gốc của máy chủ web. Trong khi đó đối với tập lệnh, nó chỉ là một phần của đường dẫn đầy đủ - đường dẫn hệ thống tập tin. Và nếu bạn cố gắng sử dụng nó trong PHP, nó sẽ dẫn đến thất bại: không có danh mục $config_path = __DIR__.'/../config/settings.php';
require $config_path;0 trên ổ cứng!
Whereas for the script it's only a part of the full path - the filesystem path. And if you try to use it in PHP it will result in a failure: there is no $config_path = __DIR__.'/../config/settings.php';
require $config_path;0 catalog on the HDD!
Để có được đường dẫn làm việc đến tệp này, chúng tôi phải thêm phần còn thiếu. Trong ví dụ của chúng tôi, đó là $config_path = __DIR__.'/../config/settings.php';
require $config_path;1, được gọi là $config_path = __DIR__.'/../config/settings.php';
require $config_path;2 và là tùy chọn cấu hình quan trọng nhất cho các tương tác hệ thống tệp. Trong PHP, bạn có thể truy cập nó thông qua $config_path = __DIR__.'/../config/settings.php';
require $config_path;3.
Vì vậy, bây giờ bạn có thể nói rằng để làm cho bất kỳ đường dẫn hệ thống tệp nào hoạt động, nó phải tuyệt đối và được xây dựng bằng cách sử dụng $config_path = __DIR__.'/../config/settings.php';
require $config_path;2. Vì vậy, một mã PHP chính xác để truy cập http://www.example.com/about/info.php
and
http://www.example.com/job/vacancy.php9 từ PHP sẽ làany file system path work, it should be absolute and built using $config_path = __DIR__.'/../config/settings.php';
require $config_path;2. So a correct PHP code to access http://www.example.com/about/info.php
and
http://www.example.com/job/vacancy.php9 from PHP would be
Ở đây chúng tôi đang sử dụng một phần máy chủ web của đường dẫn, chi tiêu nó với root tài liệu. Voila!
Đường dẫn máy chủ web
đơn giản hơn nhiều.
Giống như đã nói trước đây, đối với trình duyệt, không có tệp trên máy chủ. Người dùng trang web không bao giờ có quyền truy cập vào hệ thống tệp của máy chủ. Đối với trình duyệt, chỉ có một root trang web. Đó là không đổi và luôn luôn đơn giản là một dấu gạch chéo.site root only. Which is constant and always simply a slash.
Do đó, để tạo một liên kết HTML tuyệt đối, chỉ cần xây dựng nó từ root trang web - và bạn sẽ không bao giờ thấy lỗi 404 cho tệp hiện có nữa!
Hãy tưởng tượng trang web của bạn có hai phần,
http://www.example.com/about/info.phpand
http://www.example.com/job/vacancy.php
và trong $config_path = __DIR__.'/../config/settings.php';
require $config_path;6 bạn muốn liên kết đến $config_path = __DIR__.'/../config/settings.php';
require $config_path;7. Nếu bạn làm như vậy, $config_path = __DIR__.'/../config/settings.php';
require $config_path;8, thì Trình duyệt sẽ không tìm thấy nó! Hãy nhớ rằng, nó luôn cố gắng xây dựng liên kết đến toàn bộ, sử dụng vị trí hiện tại, đó là $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";9 và do đó đường dẫn kết quả là define('ROOT_DIR', realpath(__DIR__.'/..'));0 là sai. Để làm cho nó đúng, chúng ta phải làm cho liên kết này tuyệt đối, bắt đầu từ root trang web: define('ROOT_DIR', realpath(__DIR__.'/..'));1
Vì vậy, nó đi cho tất cả các liên kết nội bộ trên trang web - các tệp hình ảnh, JS và CSS, siêu liên kết hoặc bất kỳ tài nguyên nào khác có thể được nhấp vào hoặc tải trên trang.
Đối với các tài nguyên cục bộ, tốt hơn là chỉ làm cho nó đường dẫn, không có giao thức và tên miền - như define('ROOT_DIR', realpath(__DIR__.'/..'));1. Trong khi đối với các tài nguyên bên ngoài, các thuộc tính này là bắt buộc, và do đó, nó phải là một URL đủ điều kiện như define('ROOT_DIR', realpath(__DIR__.'/..'));3.
Kịch bản console. Điểm nhập cảnh duy nhất
Thật đáng tiếc, nhưng đối với các tập lệnh giao diện điều khiển của chúng tôi, biến $config_path = __DIR__.'/../config/settings.php';
require $config_path;3 hữu ích của chúng tôi là không khả dụng. Vì vậy, chúng tôi buộc phải sử dụng các đường dẫn liên quan đến tập lệnh gọi, xuất phát từ vị trí của tập lệnh hiện tại.
Ví dụ: nếu ứng dụng của bạn được lưu trữ trong define('ROOT_DIR', realpath(__DIR__.'/..'));5 và có hai thư mục con, define('ROOT_DIR', realpath(__DIR__.'/..'));6 và define('ROOT_DIR', realpath(__DIR__.'/..'));7 và bạn muốn truy cập vào cái sau từ trước, bạn có thể viết mã sau:
$config_path = __DIR__.'/../config/settings.php';require $config_path;
Mặc dù về mặt kỹ thuật tuyệt đối (bắt đầu từ một dấu gạch chéo), đường dẫn này về cơ bản là liên quan đến tập lệnh gọi, bởi vì nếu tập lệnh gọi sẽ được chuyển vào một thư mục khác, nó sẽ không tìm thấy tệp cấu hình nữa.
Đây là lý do tại sao nên sử dụng một điểm nhập duy nhất cho ứng dụng của bạn. Hoặc - như trong trường hợp của chúng tôi - hai điểm nhập, một điểm cho các yêu cầu web và một cho các lệnh giao diện điều khiển.
Vì vậy, đối với ứng dụng hư cấu của chúng tôi, chúng tôi sẽ có ba tệp - một điểm nhập cho mặt trước web, một điểm nhập cho các ứng dụng bảng điều khiển và tệp bootstrap:
- /var/www/app/html/index.php
- /var/www/app/bin/console.php
- /var/www/app/config/bootstrap.php
Sau đó, chúng ta có thể viết mã sau (trong số những thứ khác) trong define('ROOT_DIR', realpath(__DIR__.'/..'));8:
define('ROOT_DIR', realpath(__DIR__.'/..'));Để xác định hằng số define('ROOT_DIR', realpath(__DIR__.'/..'));9 chứa đường dẫn đến thư mục gốc của ứng dụng của chúng tôi (nằm ngay trên require __DIR__.'/../config/bootstrap.php';0 DIR).
Và sau đó trong cả require __DIR__.'/../config/bootstrap.php';1 và require __DIR__.'/../config/bootstrap.php';2
require __DIR__.'/../config/bootstrap.php';Để làm cho tất cả các công cụ bootstrap có sẵn, bao gồm cả hằng số root_dir. Từ bây giờ chúng tôi có thể sử dụng nó để xây dựng các đường dẫn tuyệt đối bắt đầu từ thư mục gốc (miễn là các tập lệnh của chúng tôi được gọi qua điểm nhập cảnh hoặc bảng điều khiển một):
include ROOT_DIR.'/config/settings.php';Việc triển khai ví dụ có thể được tìm thấy trong bảng điều khiển nghệ nhân hoặc symfony của Laravel.
Tất nhiên, cả hai điểm nhập nên thực hiện một loại người giải quyết để gọi tất cả các trang và bảng điều khiển khác nhưng điều đó hơi nằm ngoài phạm vi của bài viết này.
Các lệnh và hằng số PHP hữu ích
Có những lệnh và hằng số của Hepful trong PHP để giảm bớt nội suy đường dẫn. Một số trong số họ là:
- require __DIR__.'/../config/bootstrap.php';3 Một hằng số chứa đường dẫn tuyệt đối đầy đủ đến tệp hiện đang thực thi.
- require __DIR__.'/../config/bootstrap.php';4 Một hằng số chứa đường dẫn đến một thư mục trong đó nằm trong tệp hiện đang thực thi (thực tế nó chỉ là require __DIR__.'/../config/bootstrap.php';3 mà không có tên tệp và dấu gạch chéo kết thúc)
- Lệnh require __DIR__.'/../config/bootstrap.php';6 sẽ chuyển đổi một đường dẫn tương đối thành một đường dẫn tuyệt đối
- require __DIR__.'/../config/bootstrap.php';7 sẽ cung cấp cho bạn thư mục hiện tại
Những bài viết liên quan:
- Báo cáo lỗi PHP
- Bạn có thực sự cần kiểm tra cả isset () và trống () cùng một lúc không?
- Có gì sai với các bài báo phổ biến nói với bạn rằng FOO nhanh hơn thanh?
- MVC theo thuật ngữ đơn giản hơn hoặc cấu trúc của một ứng dụng web hiện đại
- Cách có được thứ hạng của một người chơi dựa trên điểm số
- Nhà điều hành ưu tiên hoặc làm thế nào 'hoặc chết ()' hoạt động.
- Bạn có lạm dụng nhà điều hành Null Coalescing (và ISSET/trống rỗng) không?
- Tại sao tôi nên sử dụng các câu lệnh đã chuẩn bị nếu thoát ra là an toàn?
- So sánh chuỗi số
- Các máy phát điện có thực sự làm giảm việc sử dụng bộ nhớ không?
- Bài viết
- Làm thế nào để biến Stack Overflow thành một nơi tốt đẹp
- Lặp đi lặp lại trên mảng nhận được các vật phẩm nhìn trước