Php yêu cầu tập tin từ một thư mục khác

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

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
8,
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
9 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 thực có ổ 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ị tệp hiện có, nhầm lẫn siêu liên kết với tệp, bao gồm 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/site/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], gốc được định nghĩa là dấu gạch chéo -

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
0. 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 vào 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à
    $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
    0
  • trên máy chủ web lại là ________ 50
  • 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, chẳng hạn 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
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
01 thì nó sẽ là một thư mục khác

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

  • $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
    02 [tệp nằm trong thư mục hiện tại. Giống như chỉ
    $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
    03]
  • $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
    04 [tệp nằm trong thư mục hình ảnh trong thư mục hiện tại]
  • $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
    05 [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]
  • $path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
    06 [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ư

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
07. Trong khi trên máy chủ web, địa chỉ của nó là
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
08

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ỉ.

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
09, đó 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

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
90 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, nó là ________ 191, được gọi là ________ 192 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

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
93

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

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
92. Vì vậy, một mã PHP chính xác để truy cập
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
09 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,

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
0

và trong

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
96 bạn muốn liên kết tới
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
97. Nếu bạn làm như vậy,
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
98, 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à
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
10, đ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.
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
11

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ư

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
11. 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ư
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
13

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

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
93 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ữ trên

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
15 và có hai thư mục con,
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
16 và
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
17, 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

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
9

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 các yêu cầu web và một cho các lệnh của bảng đ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

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
18

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
1

để xác định hằng số

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
19 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
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
30]

Và sau đó trong cả

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
31 và
$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
32

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
3

để 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]

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";
7

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 để bao gồm tệp thư mục trong PHP?

Để bao gồm tất cả các tệp PHP từ thư mục cùng một lúc cần một vòng lặp foreach. .
Ví dụ. Ví dụ này chứa bốn tệp PHP [file1. .
Tạo tệp1. php trong thư mục 'myGeek'
Tạo tệp2. php trong thư mục 'myGeek'
Tạo tệp3. php trong thư mục 'myGeek'
Tạo tệp4. php trong thư mục 'myGeek'
Tạo chính. php bên ngoài thư mục

__ dir __ trong PHP là gì?

Có thể sử dụng __DIR__ để lấy thư mục làm việc của mã hiện tại . Nó đã được giới thiệu trong PHP bắt đầu từ phiên bản 5. 3. Nó tương tự như sử dụng dirname[__FILE__]. Thông thường, nó được sử dụng để bao gồm các tệp khác có trong một tệp được bao gồm.

Làm cách nào để gọi một tệp từ một thư mục khác trong PHP?

Cách dễ nhất để bao gồm tệp từ một thư mục khác là sử dụng đường dẫn tuyệt đối [chỉ định đường dẫn đầy đủ tới tệp] . Ví dụ: bao gồm "C. \\http\\lib\\script. Đối với ví dụ này. 2-bản trình diễn.

Làm cách nào để bao gồm các tệp trong PHP từ thư mục mẹ?

Nhận thư mục mẹ từ bên trong thư mục con . '/ví dụ. php'; . include file require_once[dirname[plugin_dir_path[__FILE__]] . '/ví dụ.

Chủ Đề