Dirname (__ tệp __) trong php là gì?

Cách truyền thống để lấy thư mục chứa tệp hiện tại bằng PHP là sử dụng dirname(__FILE__). Từ PHP5. 3 có một hằng số ma thuật mới__DIR__ tương đương với lệnh gọi hàm này

__DIR__ hằng số ma thuật

Hằng ma thuật __DIR__ là một "hằng số ma thuật" thay đổi tùy thuộc vào nơi nó được sử dụng. Nó chứa thư mục của tệp mà nó nằm trong. Nếu tệp là một bao gồm, thì đó là thư mục bao gồm tệp nằm trong. Nếu đó là tập lệnh chính thì đó là thư mục chứa tập lệnh

__DIR__ có sẵn từ PHP 5. 3 chỉ. Nếu các phiên bản trước, thông báo sẽ được đưa ra nếu nó được sử dụng và giá trị sẽ là __DIR__ chứ không phải thư mục thực tế

__DIR__ có thể được sử dụng để 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

Xem xét cấu trúc thư mục sau -

Thư mục có tên "master" có hai tệp có tên 'worker_1' và 'worker_2'. Bản thân thư mục chính là một thư mục con của thư mục dự án chính

Thư mục dự án cũng chứa một chỉ mục. tập tin php

Xem xét việc có hai tệp trong một thư mục có tên là inc, đây là thư mục con của thư mục dự án của chúng tôi, trong đó chỉ mục. tập tin php nằm -

project_directory
├── master
│ ├── worker_1.php
│ └── worker_2.php
└── index.php

Nếu chúng ta thực thi mã -

include "master/worker_1.php";

từ chỉ mục. php, nó chạy thành công

Nhưng để chạy worker_1. php bằng cách bao gồm worker_2. php, một họ hàng bao gồm chỉ mục. php phải được thực hiện, như hình dưới đây -

Tôi thường thấy rằng những thứ đơn giản là những thứ bị lãng quên hoặc không biết nhất. Gần đây, tôi đang giúp đồng nghiệp học PHP và tôi thường được hỏi về cách di chuyển lên và xuống các cấp độ thư mục liên quan đến tệp hiện tại

Tôi biết hai cách tương đối đơn giản để làm điều này;
và một sử dụng realpath()

Chúng tôi cũng sẽ sử dụng 'Hằng số ma thuật' trong bài đăng này, nhưng tôi đã giải thích những điều này một chút ở đây một cách khéo léo

Cấp thư mục sử dụng dirname()

Nếu bạn đang sử dụng PHP 7. 0 trở lên thì cách tốt nhất để điều hướng từ đường dẫn tệp hoặc thư mục hiện tại của bạn là sử dụng dirname(). Hàm này sẽ trả về thư mục mẹ của bất kỳ đường dẫn nào chúng ta chuyển đến nó. Trong PHP 7 trở lên, chúng tôi có thể chỉ định số lượng cấp độ chúng tôi muốn di chuyển. Để sử dụng điều này, trước tiên chúng tôi chuyển đường dẫn tệp hoặc thư mục dưới dạng một chuỗi, sau đó chỉ định số cấp chúng tôi muốn chuyển lên từ thư mục đó

Giả sử rằng tập lệnh của chúng ta đang chạy trong /path/to/file/index. php

$dir = dirname(__DIR__, 2);

echo $dir; // Result = "/path"

Bằng cách sử dụng 'Magic Constant' '__DIR__' và chỉ định cấp độ 2, chúng tôi đang yêu cầu dirname() trả về 2 cấp độ từ cấp độ gốc của '__DIR__'. Trong trường hợp này '__DIR__' là '/path/to/file', nên cao hơn 2 cấp là '/path'

Nhớ. dirname() trả về thư mục mẹ, vì vậy sử dụng ‘dirname(__DIR__)’ sẽ trả về thư mục mẹ của ‘__DIR__’

Nếu chúng ta sử dụng '__FILE__' thì hơi khác một chút

$dir = dirname(__FILE__, 2);

echo $dir; // Result = "/path/to"

Vì '__FILE__' trả về tệp trong chuỗi, nên thư mục mẹ là '/path/to/file'. Bằng cách chỉ định mức 2, giờ đây chúng tôi chuyển sang ‘/path/to’ thay vào đó

Các cấp thư mục sử dụng realpath()

Nếu bạn đang sử dụng phiên bản PHP cũ hơn thì may mắn thay, chúng ta có thể sử dụng realpath()

'Magic Constant' '__DIR__' đã được thêm vào PHP trong 5. 3, vì vậy đối với người 5. 3 đến 5. 6 chúng ta có thể di chuyển các cấp thư mục như thế này

Một lần nữa, giả sử rằng tập lệnh của chúng ta đang chạy trong /path/to/file/index. php

$dir = realpath(__DIR__ . '/..');

echo $dir; // Result = "/path/to"

Trong ví dụ này, realpath() giải quyết tham chiếu ‘/. ’ liên quan đến ‘__DIR__’ và đưa chúng tôi lên 1 cấp cao hơn. Nếu chúng ta sử dụng ‘/. /. ’ sau đó chúng tôi sẽ chuyển lên 2 cấp cao hơn, v.v.

Nếu chúng ta quay trở lại xa hơn PHP 5. 3 thì chúng ta sẽ phải sử dụng realpath(), dirname() và ‘Magic Constant’ ‘__FILE__’

Về cơ bản, realpath() sẽ không chấp nhận tệp, chỉ chấp nhận đường dẫn. Điều này có nghĩa là chúng ta phải xóa 'chỉ mục. php' từ chuỗi '__FILE__' của chúng tôi. Có một số cách mà chúng ta có thể đạt được điều này, một trong số đó là sử dụng dirname()

$dir = realpath(dirname(__FILE__) . '/..');

echo $dir; // result = "/path/to"

Ví dụ này lấy thư mục mẹ của ‘__FILE__’ và sau đó giải quyết ‘/. ’ sử dụng realpath() để di chuyển nó cao hơn 1 cấp

Gọi một hằng số phải luôn nhanh hơn gọi hàm, phải không? . __DIR__ được thêm vào PHP trong 5. 3. Tài liệu PHP chính thức nêu cụ thể. “Điều này tương đương với dirname(__FILE__). ” Đổi lại tương đương không nhất thiết có nghĩa là tương đương về hiệu suất, vì vậy tôi quyết định kiểm tra hiệu suất của cả hai trên một vài biến số

Phương pháp kiểm tra

Khi chạy nhiều thử nghiệm, tôi nhận thấy rằng travis-ci có thể là một trợ thủ đắc lực. Bạn có thể xác định ma trận của các thử nghiệm mà bạn muốn chạy làm ma trận thử nghiệm của mình và sau đó sử dụng kết quả. Vì vậy, tôi thiết lập một repo cho các bài kiểm tra của mình. Repo chứa bốn phần chính

  1. Trình tạo tệp tạo mã Tôi sẽ thực sự chạy kiểm tra hiệu suất trên
  2. Tập lệnh chạy thử nghiệm chạy thử nghiệm thực tế
  3. travis. yml để xác định ma trận thử nghiệm của tôi
  4. Các tệp được sử dụng cho bài kiểm tra thực tế. Cái này không được liên kết, có 400.000 tệp. Máy phát điện hiển thị chúng

Thử nghiệm của tôi gọi chức năng tôi đang tìm kiếm 100.000 mỗi chức năng. Một lần chạy có tất cả các tệp trong 1 thư mục và lần chạy kia có một tệp trên mỗi thư mục. Tôi muốn loại trừ khả năng một thư mục duy nhất có thể ảnh hưởng đến cuộc gọi này

Tôi đã chạy thử nghiệm này trên sáu phiên bản PHP. 5. 6. 40, 7. 0. 33, 7. 1. 27, 7. 2. 15, 7. 3. 9 và 7. 4-dev. Mỗi thử nghiệm thực hiện 650 lần chạy và tôi đã xem xét thời gian của người dùng cho mỗi lần chạy đó. Điều này có nghĩa là tôi đã gọi cho cả __dir__dirname( __file__ ) mỗi người 130.000.000 lần. Sau đó, tôi tính thời gian cho mỗi lần chạy này và xem xét lần chạy tối đa (chậm nhất) đó cho mỗi lần và 95% thời gian (trung bình giữa lần chạy chậm nhất thứ 618 và 619) để loại trừ bất kỳ trường hợp cực đoan nào. Nhìn chung, kết quả giữa tối đa và 95% là tương tự nhau

Người dùng là lượng thời gian CPU dành cho mã ở chế độ người dùng (bên ngoài nhân) trong quy trình. Đây chỉ là thời gian CPU thực tế được sử dụng để thực hiện quy trình. Các quy trình khác và thời gian mà quy trình sử dụng bị chặn không được tính vào con số này

tràn ngăn xếp

Kết quả kiểm tra __DIR__ so với dirname( __FILE__)

hiệu suất 95%

kịch bản5. 67. 07. 17. 27. 37. 4dir ( 1 thư mục)1. 42. 762. 082. 512. 271. 3615dir (nhiều thư mục)1. 382. 292. 552. 36152. 651. 57dirname( 1 thư mục)1. 58152. 272. 74153. 242. 411. 5215dirname(nhiều thư mục)1. 682. 292. 08153. 292. 68151. 87

Nhìn chung, kết quả cho thấy rằng __dir__ thường nhanh hơn nhưng hiếm khi nhanh hơn nhiều. Hãy xem xét điều đó trong lần chạy chậm nhất ( sử dụng PHP 7. 2 và gọi dirname( __FILE__ ) trên nhiều thư mục), mỗi cuộc gọi mất 0. 0000329 giây. Lần chạy nhanh nhất nhanh hơn 2 phần trăm nghìn giây. Đây là một tối ưu hóa vi mô đến mức ngoại trừ ở quy mô cực lớn, bạn sẽ không bao giờ nhận thấy sự khác biệt. Điều đó nói rằng, trong hầu hết các phiên bản PHP, __DIR__ nhanh hơn

Vì thế. __dir__ hay dirname(__FILE__)0?

Vào cuối ngày, hiệu suất của __DIR__ đã tốt hơn một chút, nhưng quan trọng hơn là tôi nghĩ nó rõ ràng và dễ đọc hơn. Vì vậy, tôi thuộc đội __dir__, nhưng hiệu suất chỉ là phần thưởng

Nếu bạn có suy nghĩ khác hoặc nghĩ rằng phương pháp thử nghiệm của tôi có thể được cải thiện, vui lòng cho tôi biết trong phần nhận xét bên dưới

dirname (__ TRỰC TIẾP __) 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.

Sự khác biệt giữa __ DIR __ và dirname (__ tệp __) là gì?

__DIR__. Thư mục của tập tin. Nếu được sử dụng bên trong tệp bao gồm, thư mục của tệp được bao gồm sẽ được trả về. Điều này tương đương với dirname(__FILE__) . Tên thư mục này không có dấu gạch chéo trừ khi nó là thư mục gốc.

Làm cách nào để lấy thư mục của tệp trong PHP?

Kể từ PHP 4. 0. 2, __FILE__ trả về đường dẫn tuyệt đối của tập lệnh đang chạy ngay cả khi đó là tệp bao gồm. Bằng cách gán hằng số __FILE__ cho hàm dirname , bạn sẽ nhận được thư mục của tập lệnh.

Làm cách nào để lấy tên tệp hiện tại trong PHP?