Nếu bạn đang sử dụng XAMPP trên máy Windows 10 của mình và muốn thêm lệnh php để nó có thể sử dụng được trong dấu nhắc lệnh, bạn đã đến đúng chỗ
Bắt đầu bằng cách nhập Biến môi trường trong Tìm kiếm của bạn và nhấp vào kết quả Chỉnh sửa biến môi trường hệ thống
Đối với khách truy cập trang web, đó hoàn toàn là một máy chủ ảo, theo nhiều cách khác với máy chủ thực. Không có tập tin cho người bắt đầu. Tôi biết, thoạt nghe thật khó tin, nhưng đó là sự thật. Trong địa chỉ như //example.com/file.html
, file.html
không phải là 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 với tên như vậy, nhưng điều đó không thành vấn đề. 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ỉ
Mặt khác, đối với nhà phát triển trang web, 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ột 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 hoạt động với các tệp thực như vậy 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 đề
Ban đầu, người dùng PHP rất nhầm lẫn những vấn đề này, làm những việc như không thể định vị một tệp hiện có, nhầm lẫn giữa các siêu liên kết với các tệp, bao gồm các tệp cục bộ qua HTTP, v.v.
Tuy nhiên, để sắp xếp những thứ này ra, tất cả những gì bạn cần là nắm được hai khái niệm đơn giản.
- Sự khác biệt giữa đường dẫn tuyệt đối và tương đối
- Sự khác biệt giữa gốc của máy chủ web và gốc của hệ thống tập tin
Sự khác biệt giữa đường dẫn tuyệt đối và tương đối
Nó khá đơn giản
- Nếu đường dẫn được xây dựng bắt đầu từ gốc hệ thống, nó được gọi là đường dẫn tuyệt đối
- Nếu đường dẫn được tạo bắt đầu từ vị trí hiện tại, thì nó được gọi là tương đối [điều này có ý nghĩa vì nó tương đối với vị trí hiện tại của chúng ta]
Nó hoàn toàn giống với các hướng dẫn trong cuộc sống thực. Với địa chỉ tuyệt đối, địa chỉ bưu chính, chẳng hạn như "7119 W Sunset Blvd West Hollywood, CA 90046", bạn có thể tìm thấy vị trí từ bất cứ đâu. Tuy nhiên, với các chỉ dẫn tương đối, chẳng hạn như "giữ ba khối theo cách này rồi rẽ sang phải" sẽ chỉ hoạt động từ vị trí hiện tại, nếu không sẽ khiến bạn lạc lối
Vì vậy, nó đi theo những con đường trong thế giới máy tính. được cung cấp địa chỉ tuyệt đối, bạn luôn có thể đến nơi, bất kể bạn bắt đầu từ đâu. Trong khi đường dẫn tương đối phức tạp và nên được sử dụng một cách thận trọng, chỉ khi bạn biết chắc chắn mình đang ở đâu vào lúc này
đường dẫn tuyệt đối
Vì vậy, một lần nữa. một đường dẫn tuyệt đối là một đường dẫn bắt đầu từ gốc hệ thống
Một số ví dụ về đường dẫn tuyệt đối
/var/www/html/forum/index.php
/img/frame.gif
C:\windows\command.com
Lưu ý rằng trong các hệ thống giống Unix [và máy chủ web], thư mục gốc được định nghĩa là dấu gạch chéo - /
. Và điều này rất quan trọng để biết. Nó không chỉ là một điểm đánh dấu, mà còn là một địa chỉ đủ điều kiện, một đường dẫn. Nhập
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
0 trong bảng điều khiển unix của bạn và bạn sẽ đến thư mục gốc. Điều này cũng đúng với tất cả các máy chủ web. Vì vậy, bạn có thể biết rằng trong địa chỉ $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
1, dấu gạch chéo ở cuối không phải để trang trí mà là một địa chỉ thông thường - địa chỉ của trang chủTrên Windows, hệ thống tệp không có gốc chung cho toàn bộ hệ thống mà được phân chia giữa các đĩa, do đó, đường dẫn tuyệt đối bắt đầu từ ký tự ổ đĩa. Trong khi mỗi đĩa có gốc riêng, đó là dấu gạch chéo ngược -
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
2. Vì vậy, bạn có thể gõ $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
3 và truy cập thư mục gốc của đĩa hiện tạiVì vậy, bạn có thể nói rằng các cửa sổ khá khó hiểu, nhưng để đơn giản, chúng tôi sẽ giả vờ rằng chúng tôi chỉ có một đĩa và trong ranh giới của nó, các quy tắc gần giống như trong Unix
Vì vậy, bây giờ bạn có thể nói một đường dẫn tuyệt đối từ một đường dẫn tương đối - nó bắt đầu từ gốc, đó là
- trên hệ thống tệp Unix, nó là
/
- trên máy chủ web, nó lại _______ 63 _______
- trên Windows, đó là
2 [đối với đĩa hiện tại] hoặc$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
7 [toàn hệ thống]$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
đường dẫn tương đối
Nếu bạn không cung cấp root, điều đó có nghĩa là đường dẫn của bạn là tương đối
Ví dụ đơn giản nhất về đường dẫn tương đối chỉ là tên tệp, như
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
8. Vì vậy, người ta nên cẩn thận với các đường dẫn tương đối. Nếu thư mục hiện tại của bạn là $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
9 thì $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
8 sẽ là một, nhưng nếu bạn chuyển nó sang //www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
1 thì nó sẽ là một thư mục khácCác ví dụ đường dẫn tương đối khác
2 [tệp nằm trong thư mục hiện tại. Giống như chỉ//www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
3]//www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
4 [tệp nằm trong thư mục hình ảnh trong thư mục hiện tại]//www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
5 [tệp nằm trong thư mục cao hơn một cấp so với thư mục hiện tại]//www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
6 [tệp nằm trong thư mục cao hơn hai cấp so với thư mục hiện tại]//www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
Điều bạn nên biết là hệ thống, khi gặp một đường dẫn tương đối, luôn xây dựng nó thành một đường dẫn tuyệt đối. Cả máy chủ web và hệ thống tệp đều đang làm điều đó nhưng theo những cách khác nhau. Vì vậy, hãy tìm hiểu chúng
gốc tài liệu
Đâ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 như
//www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
7. Trong khi trên máy chủ web, địa chỉ của nó là //www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
8Và ở đây điểm có thể được nhìn thấy rõ ràng. có một phần, chung cho cả hai địa chỉ.
//www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
9, đó 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ừ thư mục 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. Và nếu bạn cố gắng sử dụng nó trong PHP, nó sẽ dẫn đến lỗi. không có danh mục
$config_path = __DIR__.'/../config/settings.php';
require $config_path;
0 trên ổ cứngĐể có được đường dẫn làm việc đến tệp này, chúng ta 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ó qua $config_path = __DIR__.'/../config/settings.php';
require $config_path;
3Vì 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 là đường dẫn 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ã PHP chính xác để truy cập //www.example.com/about/info.php
and
//www.example.com/job/vacancy.php
9 từ PHP sẽ là$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
ở đây chúng tôi đang sử dụng một phần máy chủ web của đường dẫn, thêm vào trước nó bằng tài liệu gốc. thì đấy
Đườ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 nào 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 trang gốc. Đó là hằng số và luôn luôn chỉ đơn giản là một dấu gạch chéo
Do đó, để tạo một liên kết HTML tuyệt đối, chỉ cần tạo liên kết đó từ thư mục gốc của trang web - và bạn sẽ không bao giờ gặp lại lỗi 404 đối với tệp hiện có
Hãy tưởng tượng trang web của bạn có hai phần,
//www.example.com/about/info.php
and
//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 tới $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 liên kết đầy đủ, 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, điều này là sai. Để làm cho đúng, chúng ta phải làm cho liên kết này trở nên tuyệt đối, bắt đầu từ thư mục gốc của trang web. define['ROOT_DIR', realpath[__DIR__.'/..']];
1Vì vậy, nó áp dụng cho tất cả các liên kết nội bộ trên trang web - hình ảnh, tệp 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 tài nguyên cục bộ, tốt hơn là chỉ tạo đườ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__.'/..']];
3Thư mục làm việc hiện tại
Thư mục làm việc hiện tại [cũng là thư mục hiện tại, thư mục làm việc, CWD] là thành phần chính trong các đường dẫn tương đối. Đó là thư mục, từ đó các đường dẫn tương đối được xây dựng
Trên máy chủ web, đó là một thư mục chứa tệp php được yêu cầu. Vì vậy, nếu bạn đang yêu cầu một URL như
define['ROOT_DIR', realpath[__DIR__.'/..']];
4, thì thư mục làm việc hiện tại sẽ là
5 cho trình duyệtdefine['ROOT_DIR', realpath[__DIR__.'/..']];
6 cho PHP/hệ thống tệp [với gốc tài liệu làdefine['ROOT_DIR', realpath[__DIR__.'/..']];
7]define['ROOT_DIR', realpath[__DIR__.'/..']];
do đó, tất cả các đường dẫn tương đối trong HTML trên trang đó sẽ được trình duyệt hiểu là bắt đầu từ
define['ROOT_DIR', realpath[__DIR__.'/..']];
5- một liên kết
8sẽ được yêu cầu dưới dạng /about/history. php$config_path = __DIR__.'/../config/settings.php';
require $config_path; - một hình ảnh
0 sẽ được yêu cầu dưới dạng /about/logo. pngrequire __DIR__.'/../config/bootstrap.php';
Và tương tự như vậy, đối với PHP, tất cả các đường dẫn tương đối đều bắt đầu từ
define['ROOT_DIR', realpath[__DIR__.'/..']];
6Trong bảng điều khiển, thư mục làm việc hiện tại của PHP bằng với thư mục hiện tại của trình bao. Có nghĩa là khi đang ở
require __DIR__.'/../config/bootstrap.php';
2 và gọi lệnh require __DIR__.'/../config/bootstrap.php';
3, TKT sẽ vẫn là require __DIR__.'/../config/bootstrap.php';
2Bạn có thể lấy thư mục làm việc hiện tại bằng hàm
require __DIR__.'/../config/bootstrap.php';
5 hoặc thay đổi nó bằng hàm require __DIR__.'/../config/bootstrap.php';
6Tập lệnh bảng điều khiển. Điểm vào duy nhất
Thật đáng tiếc, nhưng đối với tập lệnh bảng điều khiển, biến
$config_path = __DIR__.'/../config/settings.php';
require $config_path;
3 hữu ích của chúng tôi 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ạiVí dụ: nếu ứng dụng của bạn được lưu trữ trong
require __DIR__.'/../config/bootstrap.php';
8 và có hai thư mục con, require __DIR__.'/../config/bootstrap.php';
9 và include ROOT_DIR.'/config/settings.php';
0, và bạn muốn truy cập thư mục sau từ thư mục trước, bạn có thể viết đoạn mã sau$config_path = __DIR__.'/../config/settings.php';
require $config_path;
Mặc dù về mặt kỹ thuật là tuyệt đối [bắt đầu 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 thư mục khác, thì 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 vào 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 vào, một cho yêu cầu web và một cho lệnh đ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 vào cho mặt trước web, một điểm vào cho các ứng dụng bảng điều khiển và một tệp bootstrap
- /var/www/ứng dụng/html/chỉ mục. php
- /var/www/app/bin/console. php
- /var/www/app/config/bootstrap. php
Sau đó, chúng ta có thể viết đoạn mã sau [trong số những thứ khác] vào
include ROOT_DIR.'/config/settings.php';
1define['ROOT_DIR', realpath[__DIR__.'/..']];
để xác định hằng số
include ROOT_DIR.'/config/settings.php';
2 chứa đường dẫn đến thư mục gốc của ứng dụng của chúng tôi [ngay phía trên thư mục include ROOT_DIR.'/config/settings.php';
3]Và sau đó trong cả
include ROOT_DIR.'/config/settings.php';
4 và include ROOT_DIR.'/config/settings.php';
5require __DIR__.'/../config/bootstrap.php';
để cung cấp tất cả nội dung bootstrap, bao gồm hằng số ROOT_DIR. Từ giờ trở đi, chúng ta 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 ta được gọi thông qua điểm vào web hoặc bảng điều khiển]
include ROOT_DIR.'/config/settings.php';
Có thể tìm thấy các triển khai ví dụ trong Laravel's Artisan hoặc Symfony Console
Tất nhiên, cả hai điểm vào nên triển khai một loại trình phân giải để gọi tất cả các trang và tập lệnh 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