Làm cách nào để đặt đường dẫn trong PHP?

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ư http://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.

  1. Sự khác biệt giữa đường dẫn tuyệt đối và tương đối
  2. 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ại

Vì 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à
    $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
    2 (đối với đĩa hiện tại) hoặc
    $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
    7 (toàn hệ thống)

đườ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
http://www.example.com/about/info.php
and
http://www.example.com/job/vacancy.php
1 thì nó sẽ là một thư mục khác

Các ví dụ đường dẫn tương đối khác

  • http://www.example.com/about/info.php
    and
    http://www.example.com/job/vacancy.php
    2 (tệp nằm trong thư mục hiện tại. Giống như chỉ
    http://www.example.com/about/info.php
    and
    http://www.example.com/job/vacancy.php
    3)
  • http://www.example.com/about/info.php
    and
    http://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)
  • http://www.example.com/about/info.php
    and
    http://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)
  • http://www.example.com/about/info.php
    and
    http://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)

Đ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ư

http://www.example.com/about/info.php
and
http://www.example.com/job/vacancy.php
7. 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.php
8

Và ở đây điểm có thể được nhìn thấy rõ ràng. có một phần, chung cho cả hai địa chỉ.

http://www.example.com/about/info.php
and
http://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;
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 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
http://www.example.com/about/info.php
and
http://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,

http://www.example.com/about/info.php
and
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 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__.'/..'));
1

Vì 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__.'/..'));
3

Thư 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à

  • define('ROOT_DIR', realpath(__DIR__.'/..'));
    5 cho trình duyệt
  • define('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)

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
    $config_path = __DIR__.'/../config/settings.php';
    require $config_path;
    8sẽ được yêu cầu dưới dạng /about/history. php
  • một hình ảnh
    require __DIR__.'/../config/bootstrap.php';
    0 sẽ được yêu cầu dưới dạng /about/logo. png

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__.'/..'));
6

Trong 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';
2

Bạ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';
6

Tậ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ại

Ví 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';
1

define('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';
5

require __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

Làm cách nào để xác định đường dẫn tệp trong PHP?

php. xác định ('ROOT_DIR', realpath (__DIR__. '/. ')); . .
/var/www/ứng dụng/html/chỉ mục. php
/var/www/app/bin/console. php
/var/www/app/config/bootstrap. php

Làm cách nào để viết đường dẫn thư mục trong PHP?

Để lấy đường dẫn thư mục gốc, bạn có thể sử dụng _DIR_ hoặc dirname() . echo dirname(__FILE__); .

Làm cách nào để thêm đường dẫn đến biến trong PHP?

Tạo biến đường dẫn mới .
Nhấn Ctrl+Alt+S để mở cài đặt IDE và chọn Giao diện & Hành vi. Biến đường dẫn
Nhấp chuột. , nhập tên và giá trị của biến, rồi bấm OK để áp dụng các thay đổi