Cách đọc tệp chính xác bằng PHP. Làm việc với hệ thống tập tin

Trong PHP, bạn thường phải xử lý việc tạo một tệp... việc này rất đơn giản: không có tệp nào trên đĩa, mã đã chạy và tệp xuất hiện, sau đó bạn có thể đọc tệp này vào một biến khác hoặc thậm chí bất kỳ trang nào trên Internet và sau đó viết một cái gì đó ở đó... nhưng để làm được điều này bạn cần biết các chức năng đặc biệt... tìm hiểu thêm về điều đó trong bài viết này...

Để tạo một tệp trong PHP ở dạng tập lệnh thực thi, bạn chỉ cần chỉ định một vài hàm:

Chúng ta hãy xem một ví dụ:

$text = "Một số loại văn bản để ghi vào tập tin";
$fp = fopen("file.txt", "w");
fwrite($fp, $text);
fclose($fp);
?>

Ở đây bạn nên biết:

fopen()- chức năng mở tập tin để đọc hoặc viết và làm rõ;

Việc làm rõ này (tham số chế độ của hàm fopen) rất quan trọng:

  • "r" - mở một tập tin bằng php Chỉ để đọc. Con trỏ được đặt ở đầu.
  • "r+" - mở một tập tin bằng php để đọc và viết. Con trỏ được đặt ở đầu. !!! - với hai chế độ r và r+ này thì file phải được tạo sẵn (nếu không sẽ xuất hiện lỗi Cảnh báo: fopen(file.txt): không mở được luồng: Không có tệp hoặc thư mục như vậy trong ...) và chúng tôi chỉ đọc hoặc chúng tôi có cơ hội bổ sung.
  • "w" - tệp CHỈ được mở để ghi. Tệp bị cắt bớt độ dài bằng 0 - nghĩa là nó bị ghi đè. Những gì cần thiết sẽ được ghi và Con trỏ được đặt ở đầu.
  • "w+" - mở một tập tin để viết VÀ ĐỌC! Phần còn lại giống như ở chế độ "w". !!! - ở hai chế độ này - nếu tệp chưa được tạo - SẼ THỰC HIỆN MỘT CỐ THỬ ĐỂ TẠO NÓ!
  • "Một" - CHỈ mở tệp để ghi. Không giống như "w", tùy chọn này không ghi đè nội dung của tệp mà đặt con trỏ ở cuối dòng và nối thêm nội dung mà chúng ta muốn thêm vào cuối.
  • "một+" - mở tệp để ghi và đọc.

fwrite($fp, $text) - một hàm để ghi vào một tệp trong PHP - nghĩa là, những gì có trong biến $text được ghi vào một tệp nằm trong biến $fp;

đóng cửa($fp) - hàm đóng tệp mà chúng ta đã ghi vào biến $fp;

Bây giờ bạn có thể dễ dàng tạo các tệp bằng php một cách chính xác, mở chúng để đọc và chỉnh sửa.

Các chức năng và bổ sung PHP hữu ích để làm việc với một tệp đang mở:

while(!feof($fp))(
$mytext = fgets($fp, 99);
tiếng vang $mytext."
";
}

ở đây điều kiện được đáp ứng - "cho đến khi đạt đến cuối tập tin, hãy làm điều này" while(!feof($fp))

1. Chức năng fget($fp, 99) - cho phép bạn chia tất cả nội dung thành các phần từ 99 byte trở lên, để thấy rõ hơn điều này, chúng tôi đặt một thẻ

Hàm chuỗi này fget(xử lý tài nguyên [, int length]) theo mặc định chấp nhận 1024 byte (1 kilobyte) làm tham số độ dài, nếu không được chỉ định thì nó sẽ như vậy. Tham số này là tùy chọn kể từ PHP 4.2.0 (Trả về SAI trong trường hợp có lỗi)

Các chức năng bổ sung để mở, ghi và tạo tập tin

Chức năng - int Đọc tài liệu(tên tệp chuỗi [, bool use_include_path [, bối cảnh tài nguyên]]) - đọc toàn bộ tệp.

Đọc một tập tin và ghi nội dung vào bộ đệm đầu ra. Và trả về số byte đầu ra. Trong trường hợp có lỗi, nó sẽ trả về nếu con chó không được sử dụng - @readfile.

Một cái gì đó như thế này sẽ xảy ra:

Ở cuối từ có một thẻ
.

b. Hàm - mảng tài liệu(tên tệp chuỗi [, int use_include_path [, bối cảnh tài nguyên]]), thực hiện tương tự như hàm readfile, với một ngoại lệ, nó thêm nội dung của tệp vào một mảng:

Bằng cách này bạn có thể đọc bất kỳ trang nào trên Internet: $lines = file("http://site/"); và lặp qua mảng bằng hàm foreach;

3a. hàm chuỗi tập tin_get_contents(tên tệp chuỗi [, bool use_include_path [, bối cảnh tài nguyên [, int offset [, int maxlen]]]] - cho phép bạn lấy nội dung dưới dạng một chuỗi.

Đây là một hàm PHP phổ biến hơn để đọc tệp, tương tự như hàm tệp, chỉ nội dung được trả về dưới dạng chuỗi chứ không phải mảng và bạn có thể đặt điều kiện - bắt đầu bằng byte nào - bù lại và kết thúc ở đâu - maxlen. Nếu thất bại, nó sẽ trả về FALSE.

Quan trọng!!!- trong trường hợp này, hàm thay thế 3 cùng một lúc: fopen(), fread() và fclose() và do đó loại bỏ dấu.

3b. hàm int tập tin_put_contents(tên tệp chuỗi, dữ liệu hỗn hợp [, int flags [, bối cảnh tài nguyên]]) - giống với lệnh gọi tuần tự tới các hàm fopen(), fwrite() và fclose() - trả về số byte được ghi.

Trên thực tế, cách mở tệp php không phải là vấn đề lớn. Việc mở một chai bia có thể khó hơn khi bạn đang ở giữa rừng. Nhưng chỉ những lập trình viên đam mê mới nghĩ theo cách này. Và đối với những người mới bắt đầu, chúng tôi sẽ cho bạn biết về tất cả các khả năng của PHP để làm việc với các tệp:

tập tin php

Các tệp có phần mở rộng php chứa mã được viết bằng ngôn ngữ lập trình cùng tên. Không giống như các ngôn ngữ khác, php là ngôn ngữ lập trình phía máy chủ. Tức là nó chạy ở phía máy chủ. Do đó, để gỡ lỗi mã của nó, máy chủ cục bộ phải được cài đặt trên máy khách.

Để làm việc với các tệp php, các ứng dụng đặc biệt - trình soạn thảo phần mềm được sử dụng. Những cái phổ biến nhất là:

  • Dreamweaver.
  • PHPSửa đổi.
  • Phát triển PHP Eclipse.


Khi tạo trang web dựa trên PHP, bạn có thể cần sử dụng lại mã chương trình. Trong những tình huống như vậy, sẽ rất thuận tiện khi kết nối các giải pháp làm sẵn nằm trong một tệp khác. Cấu trúc bao gồm được sử dụng cho việc này. Cú pháp của nó là:

bao gồm tên tệp

Ví dụ kết nối:

Tập tin đi kèm:


Cũng có thể bao gồm một tệp bằng cách sử dụng cấu trúc yêu cầu. Không giống như include, nó bao gồm tệp trước khi mã chương trình được thực thi. Sử dụng yêu cầu trong mã, chỉ có thể thực hiện một lệnh gọi đến tệp này. Khi truy cập lại, hệ thống sẽ hiển thị thông báo lỗi chung và dừng thực thi chương trình.

Cấu trúc include chỉ bao gồm nguồn trong quá trình thực thi chương trình. Nó hỗ trợ đọc nhiều tập tin php. Nếu xảy ra lỗi, chỉ một thông báo cảnh báo sẽ được hiển thị và việc thực thi mã sẽ tiếp tục từ dòng tiếp theo.



Mở và đóng tập tin

Trong php, tất cả các thao tác với tệp được thực hiện theo nhiều giai đoạn:

  • Mở một tập tin;
  • Chỉnh sửa nội dung;
  • Đóng tập tin.

Hàm fopen() được sử dụng để mở một tập tin. Cú pháp của nó là:

int fopen(tên tệp chuỗi, chế độ chuỗi [, int use_include_path])

Đối số được chấp nhận:

  • tên tệp chuỗi – tên tệp hoặc đường dẫn tuyệt đối đến nó. Nếu đường dẫn đến tệp không được chỉ định, nó sẽ được tìm kiếm trong thư mục hiện tại. Nếu thiếu file bạn đang tìm, hệ thống sẽ hiển thị thông báo lỗi. Ví dụ:


  • chế độ chuỗi - cho biết chế độ mở tập tin. Các giá trị được đối số chấp nhận:
  • r – tệp được mở để chỉ đọc, con trỏ tệp được đặt ở đầu;
  • r+ – tệp được mở để đọc và ghi;
  • w – tạo một tập tin mới chỉ để ghi. Nếu một tệp có cùng tên đã tồn tại thì tất cả dữ liệu trong đó sẽ tự động bị xóa;
  • w+ - tạo một tập tin mới để ghi và đọc. Khi một tệp như vậy tồn tại, dữ liệu của nó sẽ bị ghi đè hoàn toàn bằng tệp mới;
  • a – tập tin được mở để ghi. Con trỏ được đặt ở cuối. Nghĩa là, việc ghi vào tệp php sẽ không bắt đầu từ đầu mà từ cuối;
  • a+ – mở file ở chế độ đọc-ghi. Việc ghi âm sẽ bắt đầu từ cuối;
  • b – chế độ làm việc với file chứa dữ liệu nhị phân (trong hệ số nhị phân). Chế độ này chỉ có trên hệ điều hành Windows.

Để đóng quyền truy cập vào một tập tin, hãy sử dụng hàm fclose(). Cú pháp:

int fclose (int file), trong đó int file là một điều khiển để đóng trang web.

Sau mỗi lần đọc hoặc ghi, tệp phải được đóng bằng chức năng này. Nếu không, luồng được tạo cho tệp vẫn mở. Và điều này dẫn đến việc tiêu tốn dung lượng máy chủ một cách không cần thiết.

Ví dụ:

Đọc và ghi tập tin

Để chỉ hiển thị toàn bộ nội dung của một tệp, hàm readfile() là lý tưởng. Cú pháp của nó là:

readfile (string filename) , trong đó string filename là tên tệp chuỗi (không phải là một điều khiển).


int fpassthru (tệp int)

Chức năng này yêu cầu mở và đóng một tập tin. Ví dụ:

Kết quả tương tự như lần trước.

Các hàm làm việc với file trong php cho phép bạn đọc nội dung theo từng dòng và từng ký tự:

  • chuỗi fgets (tệp int, độ dài int)– hàm đọc một chuỗi có độ dài . Ví dụ:


  • chuỗi fread (tệp int, độ dài int)– hành động giống hệt với hành động trước đó.

Để ghi dữ liệu văn bản vào một tập tin, có hai hàm giống nhau:

  • kết quả int (tệp int, chuỗi chuỗi [, độ dài int])
  • int fwrite(tệp int, chuỗi chuỗi [, độ dài int])

Các hàm ghi vào tệp int một chuỗi chuỗi có độ dài int được chỉ định ( đối số tùy chọn). Ví dụ:


Tạo và xóa tập tin

Để tạo tệp php, bạn có thể sử dụng hàm fopen() ở chế độ truy cập "w" hoặc "w+". Hoặc hàm touch(). Nó đặt thời gian sửa đổi tập tin. Nếu không có phần tử nào có tên được tìm kiếm thì nó sẽ được tạo. Cú pháp của nó là:

int touch (tên tệp chuỗi [, int time [, int atime]])

Để tạo một bản sao của một tập tin, hãy sử dụng hàm copy(). Là đối số, nó lấy tên của bản gốc và tệp nơi nội dung sẽ được sao chép. Nếu nó không tồn tại, nó sẽ được tạo ra. Cú pháp hàm:

bản sao int(chuỗi file1, chuỗi file2)


Bạn có thể xóa một tập tin bằng hàm unlink(). Cú pháp của nó.

Trước khi thử làm việc với một tập tin, bạn nên đảm bảo rằng nó tồn tại. Để giải quyết vấn đề này, hai hàm thường được sử dụng:

file_exists() và is_file().

Hàm file_exists() kiểm tra xem một tệp đã cho có tồn tại hay không. Nếu tệp tồn tại, hàm trả về TRUE, nếu không thì trả về FALSE. Cú pháp hàm file_exists() là:

bool file_exists(tệp chuỗi)

Ví dụ kiểm tra sự tồn tại của file:

if (!file_exists($filename)) :

print "Tệp $filename không tồn tại!";

is_file()

Hàm is_file() kiểm tra sự tồn tại của một tệp nhất định và liệu nó có thể được đọc/ghi hay không. Về cơ bản, is_file() là phiên bản mạnh mẽ hơn của file_exists(), nó không chỉ kiểm tra xem một tệp có tồn tại hay không mà còn kiểm tra xem nó có thể đọc và ghi dữ liệu hay không:

bool is_file(tệp chuỗi)

Ví dụ sau đây cho thấy cách xác minh rằng một tệp có tồn tại và các thao tác có thể được thực hiện trên đó:

$file = "somefile.txt";

nếu (is_file($file)) :

print "Tệp $file hợp lệ và tồn tại!";

print "Tệp $file không tồn tại hoặc nó không phải là tệp hợp lệ!";

Sau khi đảm bảo rằng tệp mong muốn tồn tại và có thể thực hiện nhiều thao tác đọc/ghi khác nhau với tệp đó, bạn có thể tiến hành bước tiếp theo - mở tệp.

Hàm filesize() trả về kích thước (tính bằng byte) của tệp có tên đã cho hoặc FALSE nếu có lỗi. Cú pháp hàm Filesize():

kích thước tệp int(tên tệp chuỗi)

Giả sử bạn muốn xác định kích thước của tệp Pasts.txt. Để có được thông tin cần thiết, bạn có thể sử dụng hàm filesize():

$fs = kích thước tập tin("pastry.txt"); print "Pastry.txt là $fs byte.";

Kết quả sau đây được hiển thị:

Pastry.txt là 179 byte.

Trước khi bạn có thể thực hiện các thao tác trên một tệp, bạn phải mở nó và liên kết nó với một trình xử lý tệp và sau khi làm việc xong với tệp, bạn phải đóng nó lại. Những chủ đề này sẽ được đề cập trong phần tiếp theo.

Mở và đóng tập tin

Trước khi bạn có thể thực hiện I/O trên một tập tin, bạn phải mở nó bằng fopen().

Hàm fopen() mở một tệp (nếu nó tồn tại) và trả về một số nguyên -- được gọi là thao tác tập tin(xử lý tập tin). Cú pháp hàm fopen():

int fopen (tệp chuỗi, chế độ chuỗi [, int allow_path])

Tệp đang được mở có thể nằm trên hệ thống tệp cục bộ, tồn tại dưới dạng luồng đầu vào/đầu ra tiêu chuẩn hoặc biểu thị một tệp trên hệ thống từ xa được chấp nhận qua HTTP hoặc FTP.

Tham số tệp có thể được chỉ định theo nhiều dạng, được liệt kê bên dưới:

Nếu tham số chứa tên của một tệp cục bộ, fopen() sẽ mở tệp đó và trả về một điều khiển.

Nếu tham số được chỉ định là php://stdin, php://stdout hoặc php://stderr, luồng đầu vào/đầu ra tiêu chuẩn tương ứng sẽ được mở.

Nếu tham số bắt đầu bằng tiền tố http:// thì hàm sẽ mở kết nối HTTP tới máy chủ và trả về một điều khiển cho tệp đã chỉ định.

Nếu tham số bắt đầu bằng tiền tố ftp:// thì hàm sẽ mở kết nối FTP tới máy chủ và trả về một điều khiển cho tệp đã chỉ định. Có hai điều cần đặc biệt chú ý trong trường hợp này: Nếu máy chủ không hỗ trợ chế độ FTP thụ động, lệnh gọi fopen() sẽ thất bại. Hơn nữa, các tệp FTP được mở để đọc hoặc ghi.

Khi hoạt động ở chế độ thụ động, máy chủ YAR chờ kết nối từ máy khách. Khi hoạt động ở chế độ hoạt động, máy chủ sẽ tự thiết lập kết nối với máy khách. Mặc định thường là chế độ hoạt động.

Tham số chế độ xác định khả năng đọc và ghi vào tệp. Trong bảng 7.1 liệt kê một số giá trị xác định chế độ mở tệp.

Bảng 7.1. Các chế độ mở tập tin

Cách thức Sự miêu tả
Chỉ đọc thôi. Con trỏ vị trí hiện tại được đặt ở đầu tệp
r+ Đọc và viết. Con trỏ vị trí hiện tại được đặt ở đầu tệp
w Chỉ ghi âm. Con trỏ vị trí hiện tại được đặt ở đầu tệp và toàn bộ nội dung của tệp sẽ bị hủy. Nếu tệp không tồn tại, hàm sẽ cố gắng tạo nó
w+ Đọc và viết. Con trỏ vị trí hiện tại được đặt ở đầu tệp và toàn bộ nội dung của tệp sẽ bị hủy. Nếu tệp không tồn tại, hàm sẽ cố gắng tạo nó
Một Chỉ ghi âm. Con trỏ vị trí hiện tại được đặt ở cuối tệp. Nếu tệp không tồn tại, hàm sẽ cố gắng tạo nó
một+ Đọc và viết. Con trỏ vị trí hiện tại được đặt ở cuối tệp. Nếu tệp không tồn tại, hàm sẽ cố gắng tạo nó

Nếu tham số thứ ba tùy chọn include_path là 1 thì đường dẫn tệp có liên quan đến thư mục include được chỉ định trong tệp php.ini (xem Chương 1).

Dưới đây là ví dụ về mở tệp bằng hàm fopen(). Lệnh gọi die(), được sử dụng kết hợp với fopen(), cung cấp thông báo lỗi nếu không thể mở được tệp:

$file = "userdata.txt"; // Một số tập tin

$fh = fopen($file, "a+") hoặc die("Tệp ($file) không tồn tại!");

Đoạn mã sau sẽ mở kết nối tới trang web PHP (http://www.php.net):

$site = "http://www.php.net": // Máy chủ có thể truy cập qua HTTP

$sh = fopen($site., "r"); //Liên kết trình thao tác với trang chỉ mục Php.net

Sau khi hoàn thành công việc, tệp phải luôn được đóng bằng fclose().

Hàm fclose() đóng một tệp bằng trình thao tác đã cho. Nếu đóng thành công thì trả về TRUE, nếu đóng không thành công thì trả về FALSE. Cú pháp hàm fclose():

int fclose(trình thao tác int)

Hàm fclose() chỉ đóng thành công những tệp đã được mở trước đó bằng hàm fopen() hoặc fsockopen(). Ví dụ về đóng một tập tin:

$file = "userdata.txt";

nếu (file_exists($file)) :

$fh = fopen($file, "r");

// Thực hiện các thao tác với tập tin

print "Tập tin không tồn tại!";

Viết vào tập tin

Có hai thao tác chính được thực hiện trên các tệp đang mở: đọc và ghi.

Hàm is_writeable() xác minh rằng một tệp tồn tại và có thể ghi được. Khả năng ghi được kiểm tra cho cả tập tin và thư mục. Cú pháp hàm is_writeable() là:

bool is_writeable (tệp chuỗi)

Một điều quan trọng cần lưu ý là PHP rất có thể sẽ chạy theo ID người dùng được máy chủ web sử dụng (thường là "không ai"). Một ví dụ về việc sử dụng is_writeable() được đưa ra trong phần mô tả hàm fwrite().

Hàm fwrite() ghi nội dung của biến chuỗi vào tệp được chỉ định bởi trình xử lý tệp. Cú pháp hàm fwrite():

int fwrite(trình thao tác int, biến chuỗi [, độ dài int])

Nếu tham số độ dài tùy chọn được truyền khi gọi hàm, quá trình ghi sẽ dừng sau khi ghi số lượng ký tự được chỉ định hoặc khi đến cuối dòng. Việc kiểm tra xem một tập tin có thể được ghi vào hay không được thể hiện trong ví dụ sau:

// Thông tin về lưu lượng truy cập trên trang web của người dùng

$data = "08:13:00|12:37:12|208.247.106.187|Win98";

$filename = "somefile.txt";

// Nếu file tồn tại và có thể được ghi vào

if (is_writeable($filename)) :

$fh = fopen($tên tệp, "a+");

// Ghi nội dung của $data vào một file

$ thành công - fwrite($fh, $data);

// Đóng tập tin

fclose($fh); khác:

print "Không thể mở Sfilename để viết";

Hàm fputs() là bí danh của fwrite() và có thể được sử dụng ở bất cứ nơi nào sử dụng fwrite().

Hàm fputs() là bí danh của fwrite() và có cú pháp giống hệt nhau. Cú pháp hàm fputs():

int fputs(int manipulator, biến chuỗi [, int length])

Cá nhân tôi thích sử dụng fputs() hơn. Cần nhớ rằng đây chỉ là vấn đề về kiểu dáng và không liên quan gì đến bất kỳ sự khác biệt nào giữa hai chức năng.

Đọc từ một tập tin

Không còn nghi ngờ gì nữa, đọc là thao tác quan trọng nhất được thực hiện trên các tệp. Dưới đây là một số tính năng giúp việc đọc từ tệp hiệu quả hơn. Cú pháp của các hàm này sao chép gần như chính xác cú pháp của các hàm ghi tương tự.

Hàm i s_readable() cho phép bạn xác minh rằng tệp tồn tại và có thể đọc được. Khả năng đọc được kiểm tra cho cả tập tin và thư mục. Cú pháp hàm is_readable() là:

ù! is_readable(tệp chuỗi]

Rất có thể, PHP sẽ chạy theo ID người dùng được máy chủ web sử dụng (thường là "không ai"), vì vậy để hàm is_readable() trả về TRUE, mọi người phải cho phép đọc tệp. Ví dụ sau đây cho thấy cách xác minh rằng tệp tồn tại và có thể đọc được:

if (is_readable($filename)) :

// Mở file và đặt con trỏ vị trí hiện tại về cuối file

$fh = fopen($filename, "r");

print "$filename không đọc được!";

Hàm fread() đọc số byte được chỉ định từ một tệp được chỉ định bởi trình xử lý tệp. Cú pháp hàm fwrite():

int fread(trình thao tác int, độ dài int)

Người thao tác phải tham chiếu đến một tệp đang mở có thể đọc được (xem mô tả về hàm is_readable()). Việc đọc dừng lại sau khi đọc xong một số byte nhất định hoặc khi đến cuối tệp. Hãy xem xét tệp văn bản Pastry.txt được hiển thị trong Liệt kê 7.1. Việc đọc và xuất tệp này trong trình duyệt được thực hiện bởi đoạn sau:

$fh = fopen("pastry.txt", "r") hoặc die("Không thể mở tập tin!");

$file = fread($fh, filesize($fh));

Bằng cách sử dụng hàm fllesize() để xác định kích thước của Pastry.txt theo byte, bạn đảm bảo rằng hàm fread() đọc toàn bộ nội dung của tệp.

Liệt kê 7.1. Tệp văn bản Pastry.txt

Công thức: Bột làm bánh ngọt

1 1/4 chén bột mì đa dụng

3/4 thanh (6 muỗng canh) bơ không muối, cắt nhỏ

2 thìa canh rau rút ngắn 1/4 thìa cà phê muối

3 muỗng canh nước

Hàm fgetc() trả về một chuỗi chứa một ký tự từ tệp ở vị trí con trỏ hiện tại hoặc FALSE khi đến cuối tệp. Cú pháp hàm fgetc():

chuỗi fgetc (trình thao tác int)

Trình thao tác phải tham chiếu đến một tệp đang mở có thể đọc được (xem mô tả về hàm is_readable() ở phần trước của chương này). Ví dụ sau đây minh hoạ cách đọc và xuất từng ký tự của một tệp bằng hàm fgetc():

$fh = fopen("pastry.txt", "r"); trong khi (!feof($fh)) :

$char = fgetc($fh):

in $char; cuối cùng;

Hàm fgets() trả về một chuỗi được đọc từ vị trí con trỏ hiện tại trong tệp được chỉ định bởi trình xử lý tệp. Con trỏ tệp phải trỏ đến một tệp đang mở có thể đọc được (xem mô tả về hàm is_readable() ở phần trước của chương này). Cú pháp hàm fgets():

fget chuỗi (trình thao tác int, độ dài int)

Việc đọc dừng lại khi đáp ứng một trong các điều kiện sau:

  • đọc từ độ dài tệp - 1 byte;
  • một ký tự dòng mới được đọc từ tệp (có trong chuỗi trả về);
  • Cờ kết thúc tệp (EOF) đã được đọc từ tệp.

Nếu bạn muốn tổ chức việc đọc tệp theo từng dòng, hãy chuyển vào tham số thứ hai một giá trị rõ ràng là lớn hơn số byte trong dòng. Ví dụ về đọc và xuất file theo từng dòng:

$fh = fopen("pastry.txt", "r");

while (!feof($fh));

$line = fgets($fh, 4096);

in dòng $. "
";

Hàm fgetss() hoàn toàn giống với fgets() ngoại trừ một ngoại lệ - nó cố gắng xóa tất cả các thẻ HTML và PHP khỏi văn bản đã đọc:

chuỗi fgetss (Trình thao tác Int, độ dài int [, chuỗi allow_tags])

Trước khi chuyển sang các ví dụ, hãy xem lại nội dung của Liệt kê 7.2—tệp này được sử dụng trong Liệt kê 7.3 và 7.4.

Liệt kê 7.2. Tệp khoa học.html

Tin nóng - Khoa học

Phát hiện dạng sống ngoài hành tinh


Ngày 20 tháng 8 năm 2000

Sáng sớm hôm nay, người ta tìm thấy một dạng nấm mới lạ mọc trong tủ lạnh của căn hộ cũ của W. J. Gilmore. Người ta không biết liệu bức xạ mạnh phát ra từ màn hình máy tính của người thuê nhà có hỗ trợ quá trình tiến hóa này hay không.

Liệt kê 7.3. Xóa thẻ khỏi tệp HTML trước khi hiển thị trên trình duyệt

$fh = fopen("science.html", "r");

trong khi (!feof($fh)) :

in fgetss($fh, 2048);

Kết quả sẽ được hiển thị dưới đây. Như bạn có thể thấy, tất cả các thẻ HTML đã bị xóa khỏi tệp science.html, khiến định dạng bị mất:

Trong một số trường hợp, tất cả trừ một số thẻ đều bị xóa khỏi tệp - ví dụ: thẻ ngắt dòng
. Liệt kê 7.4 cho thấy điều này được thực hiện như thế nào.

Liệt kê 7.4. Xóa có chọn lọc các thẻ khỏi tệp HTML

$fh = fopenC"science.html", "r");

$ được phép = "
";

trong khi (!feof($fh)) :

in fgetss($fh. 2048, $allowable);

Kết quả:

Tin Nóng - Khoa Học Phát hiện dạng sống của người ngoài hành tinh vào ngày 20 tháng 8 năm 2000 Sáng nay, người ta phát hiện một dạng nấm mới lạ mọc trong tủ đựng tủ lạnh căn hộ cũ của W. J. Gilmore. Người ta không biết liệu bức xạ mạnh phát ra từ màn hình máy tính của người thuê nhà có hỗ trợ điều này hay không sự tiến hóa.

Như bạn có thể thấy, hàm fgetss() giúp chuyển đổi tệp dễ dàng, đặc biệt khi bạn có số lượng lớn tệp HTML có định dạng tương tự.

Đọc một tập tin vào một mảng

Hàm file() tải toàn bộ nội dung của tệp vào một mảng có thể lập chỉ mục. Mỗi phần tử của mảng tương ứng với một dòng của tệp. Cú pháp hàm File():

tệp mảng (tệp chuỗi [, int include_path])

Nếu tham số thứ ba tùy chọn include_path là 1 thì đường dẫn tệp có liên quan đến thư mục include được chỉ định trong tệp php.ini (xem Chương 1). Liệt kê 7.5 sử dụng hàm file() để tải tệp Pastry.txt (xem Liệt kê 7.1).

$file_array = file("pastry.txt");

trong khi (list($line_num. $line) = eacht($file_array)):

in " Dòng $line_num:", htmlspecialchars($line), "
\N"

Mỗi hàng của mảng được in cùng với một số:

Dòng 0: Công thức: Bột làm bánh ngọt

Dòng 1: 1 1/4 cốc bột mì đa dụng

Dòng 2: 3/4 thanh (6 muỗng canh) bơ không muối, cắt nhỏ

Dòng 3: 2 thìa canh rau rút ngắn

Dòng 4: 1/4 thìa cà phê muối

Dòng 5: 3 thìa nước

Chuyển hướng tập tin sang đầu ra tiêu chuẩn

Hàm readfile() đọc nội dung của tệp và ghi nó vào đầu ra tiêu chuẩn (trong hầu hết các trường hợp là vào trình duyệt). Cú pháp hàm readfile():

int readfile (tệp chuỗi [, int include_path])

Hàm trả về số byte đã đọc. Tệp có thể nằm trên hệ thống tệp cục bộ, tồn tại dưới dạng đầu vào/đầu ra tiêu chuẩn hoặc biểu thị tệp trên hệ thống từ xa được chấp nhận qua HTTP hoặc FTP. Tham số tệp được đặt theo quy tắc tương tự như trong hàm fopen().

Giả sử bạn có một tệp latorre.txt, nội dung mà bạn muốn hiển thị trong trình duyệt:

Nhà hàng "La Torre." nằm ở Nettuno, Ý, mang đến sự pha trộn phong cách chiết trung. lịch sử và ẩm thực hải sản hảo hạng. Trong các bức tường của Borgo thời Trung cổ bao quanh thành phố, người ta có thể dùng bữa trong khi ngắm nhìn người qua đường mua sắm tại các cửa hàng trong làng. Sự thoải mái cùng với đồ biển tươi ngon nhất khiến La Torre trở thành một trong những nhà hàng ngon nhất nước Ý.

Khi đoạn mã sau được thực thi, toàn bộ nội dung của latorre.txt sẽ được gửi đến đầu ra tiêu chuẩn:

$restaurant_file = "latorre.txt";

// Gửi toàn bộ file tới đầu ra tiêu chuẩn

readfile ($ nhà hàng_file);

Mở trình xử lý tệp quy trình

Cùng với các tệp thông thường, bạn có thể mở trình thao tác tệp để tương tác với các tiến trình trên máy chủ. Vấn đề được giải quyết bằng hàm popen(), có cú pháp sau:

int popen (lệnh chuỗi, chế độ chuỗi)

Tham số lệnh chỉ định lệnh hệ thống sẽ được thực thi và tham số mode mô tả chế độ truy cập:

// Mở file "spices.txt" để viết

$fh = fopen("spice.txt","w");

// Thêm một số dòng văn bản

fputs($fh, "Mùi tây, cây xô thơm, hương thảo\n");

fputs($fh, "ớt bột, muối, tiêu\n");

fputs($fh, "Húng quế, cây xô thơm, gừng\n");

// Đóng trình thao tác

// Mở một tiến trình grep UNIX để tìm kiếm từ Basil trong file Spice.txt

$fh - popen("grep Basil< spices.txt", "r");

// In kết quả của grep

Kết quả trông như thế này:

Húng quế, xô thơm, gừng

Hàm fpassthru() tương tự như hàm passthru() được thảo luận trong phần “Chạy các chương trình bên ngoài” của chương này.

Sau khi hoàn thành tất cả các thao tác, tệp hoặc quy trình phải được đóng lại. Hàm pclose() đóng kết nối với tiến trình được chỉ định bởi trình thao tác, tương tự như cách hàm fclose() đóng một tệp được mở bởi hàm fopen(). Cú pháp hàm pclose():

int pclose (thao tác int)

Trong tham số kẻ thao túng trình điều khiển nhận được trước đó với lệnh gọi thành công tới popen() sẽ được truyền đi.

Mở kết nối ổ cắm

PHP không bị giới hạn trong việc tương tác với các tệp và quy trình—bạn cũng có thể tạo kết nối qua ổ cắm. Ổ cắmỔ cắm là một phần mềm trừu tượng cho phép bạn giao tiếp với nhiều dịch vụ khác nhau trên một máy tính khác.

Hàm fsockopen() thiết lập kết nối socket tới máy chủ trên Internet

thông qua giao thức TCP hoặc UDP. Cú pháp hàm fsockopen():

int fsockopen (nút chuỗi, cổng int [, int error_code [, chuỗi error_text [, int timeout]]])

Các tham số tùy chọn error_code và error_text chứa thông tin sẽ được hiển thị nếu kết nối với máy chủ không thành công. Cả hai tham số phải được truyền bằng tham chiếu. Tham số tùy chọn thứ ba, thời gian chờ, chỉ định khoảng thời gian chờ phản hồi từ máy chủ (tính bằng giây). Liệt kê 7.6 minh họa việc sử dụng hàm fsockopen() để lấy thông tin máy chủ. Tuy nhiên, trước khi xem Liệt kê 7.6, có thêm một hàm nữa bạn cần biết: socket_set_blocking().

UDP (Giao thức gói dữ liệu người dùng) là một giao thức truyền thông không kết nối.

socket_set_blocking()

Hàm socket_set_b1ocki ng() cho phép bạn đặt kiểm soát thời gian chờ cho hoạt động của máy chủ:

socket_set_blocking(int thao tác, chế độ boolean)

Tham số thao tác chỉ định ổ cắm đã mở trước đó và tham số chế độ chọn chế độ mà ổ cắm được chuyển sang (TRUE cho chế độ chặn, FALSE cho chế độ không chặn). Một ví dụ về cách sử dụng các hàm fsockopen() và socket_set_blocking() được hiển thị trong Liệt kê 7.6.

Liệt kê 7.6. Sử dụng fsockopen() để lấy thông tin máy chủ

hàm getthehost($host.$path) (

// Mở kết nối tới nút

$fp - fsockopen($host, 80, &$errno, &$errstr, 30);

// Chuyển sang chế độ chặn

socket_set_blocking($fp, 1),

// Gửi tiêu đề

fputs($fp,"GET $path HTTP/1.1\r\n");

fputs($fp, "Máy chủ: $host\r\n\r\n"); $x = 1;

// Lấy tiêu đề

trong khi($x< 10) :

$headers = fgets($fp, 4096);

// Đóng trình thao tác

getthehost("www.apress.com", "/");

Việc chạy Liệt kê 7.6 tạo ra kết quả đầu ra sau:

HTTP/1.1 200 OK Máy chủ: Microsoft-IIS/4.0 Vị trí nội dung:

2000 20:25:06 GMT ETag: "f0a61666dbff1bf1:34a5" Độ dài nội dung: 1311

Hàm pfsockopen() là phiên bản ổn định của fsockopen(). Điều này có nghĩa là kết nối sẽ không tự động bị đóng khi tập lệnh chứa hàm được gọi kết thúc. Cú pháp hàm pfsockopen() là:

int pfsockopen (nút chuỗi, cổng int [, int error_code [, chuỗi error_text [, int timeout]]])

Tùy thuộc vào mục tiêu cụ thể của ứng dụng của bạn, bạn có thể thấy thuận tiện hơn khi sử dụng pfsockopen() thay vì fsockopen().

Khởi chạy các chương trình bên ngoài

Các tập lệnh PHP cũng có thể thực thi các chương trình nằm trên máy chủ. Tính năng này đặc biệt thường được sử dụng khi quản trị hệ thống thông qua trình duyệt web, cũng như để lấy thông tin tóm tắt về hệ thống một cách thuận tiện hơn.

Hàm exec() chạy một chương trình nhất định và trả về dòng cuối cùng của kết quả đầu ra. Cú pháp của hàm exec():

thực thi chuỗi (lệnh chuỗi [, mảng chuỗi [, int return]])

Xin lưu ý rằng hàm exec() chỉ thực thi lệnh và không in kết quả của nó. Tất cả đầu ra lệnh có thể được lưu trữ trong một tham số mảng tùy chọn. Ngoài ra, nếu một biến trả về cũng được chỉ định khi tham số mảng được chỉ định, thì biến sau sẽ được gán mã trả về của lệnh được thực thi.

Liệt kê 7.7 cho thấy cách sử dụng hàm exec() để thực thi hàm hệ thống ping UNIX.

Liệt kê 7.7. Kiểm tra kết nối với máy chủ bằng hàm exec()

exec("ping -từ 5 www.php.net", $ping);

// Trên Windows - exec("ping -n 5 www.php.net. $ping);

với ($i=0; $i< count($ping);$i++) :

in "
$ping[$i]";

Kết quả:

PING www.php.net (208.247.106.187): 56 byte dữ liệu

64 byte từ 208.247.106.187: icmp_seq=0 ttl=243 time=66.602 ms

64 byte từ 208.247.106.187: icmp_seq=1 ttl=243 time=55,723 ms

64 byte từ 208.247.106.187: icmp_seq=2 ttl=243 time=70.779 ms

64 byte từ 208.247.106.187: icmp_seq=3 ttl=243 time=55.339 ms

64 byte từ 208.247.106.187: icmp_seq=4 ttl=243 time=69,865 ms

thống kê ping www.php.net --

5 gói được truyền đi Đã nhận được 5 gói. Mất gói 0%

chuyến đi khứ hồi tối thiểu/avg/max/stddev - 55,339/63,662/70,779/6,783 ms

Trở lại dấu nháy đơn

Có một cách khác để thực thi các lệnh hệ thống không yêu cầu chức năng gọi - lệnh đang được thực thi được đặt trong dấu backticks (` `) và kết quả hoạt động của nó được hiển thị trong trình duyệt. Ví dụ:

in "

$đầu ra
";

Đoạn mã này hiển thị nội dung của thư mục chứa tập lệnh trong trình duyệt.

Tham số bên trong ping -c 5 (-p 5 trên Windows) chỉ định số lượng cuộc thăm dò máy chủ.

Nếu bạn chỉ muốn trả về kết quả chưa được định dạng của lệnh, hãy sử dụng hàm passthru() được mô tả bên dưới.

Hàm passthru() hoạt động gần giống như hàm exec(), ngoại trừ một ngoại lệ - nó tự động in kết quả của lệnh. Cú pháp hàm Passthru():

void passthru(chuỗi lệnh [, int return])

Nếu một tham số trả về tùy chọn được truyền khi gọi passthru(), biến này được đặt thành mã trả về của lệnh được thực thi.

escapeshellcmd()

Hàm escapeshellcmd() thoát khỏi mọi ký tự nguy hiểm tiềm tàng mà người dùng có thể nhập vào (ví dụ: trên biểu mẫu HTML) để thực thi các lệnh exec(), passthru(), system() hoặc popen(). Cú pháp:

chuỗi escapeshellcmd (lệnh chuỗi)

Đầu vào của người dùng phải luôn được xử lý một cách thận trọng, nhưng ngay cả như vậy, người dùng vẫn có thể nhập các lệnh sẽ được thực thi bởi các chức năng lệnh hệ thống. Hãy xem xét đoạn mã sau:

$user_input = `rm -rf *`; // Xóa thư mục mẹ và tất cả các thư mục con của nó

exec($user_input); // Thực thi $user_input !!!

Nếu không có biện pháp phòng ngừa, một mệnh lệnh như vậy sẽ dẫn đến thảm họa. Tuy nhiên, bạn có thể sử dụng các hàm escapeshellcmd() để thoát khỏi thao tác nhập của người dùng:

$user_input = `rm - rf *`; // Xóa thư mục mẹ và tất cả các thư mục con của nó

ex(escapeshellcmd($user_input)); // Thoát khỏi những nhân vật nguy hiểm

Hàm escapeshellcmd() thoát khỏi ký tự *, ngăn lệnh gây ra hậu quả thảm khốc.

Bảo mật là một trong những khía cạnh quan trọng nhất của lập trình Web, vì vậy tôi đã dành nguyên một chương cho chủ đề này và nó liên quan như thế nào đến lập trình PHP. Xem Chương 16 để biết thêm thông tin.

Làm việc với hệ thống tập tin

PHP có các chức năng xem và thực hiện các thao tác khác nhau trên các tệp trên máy chủ. Thông tin về thuộc tính tệp máy chủ (vị trí, chủ sở hữu và đặc quyền) thường hữu ích.

Hàm basename() trích xuất tên tệp từ tên đầy đủ được truyền vào. Cú pháp hàm Basename():

tên cơ sở chuỗi(chuỗi full_name)

Việc trích xuất tên file cơ sở từ tên đầy đủ được thực hiện như sau:

$path = "/usr/local/phppower/htdocs/index.php"; $file = tên cơ sở($path); // $file = "index.php"

Trên thực tế, hàm này loại bỏ đường dẫn khỏi tên đầy đủ và chỉ để lại tên tệp.

Hàm getlastmod() trả về ngày và giờ của lần sửa đổi cuối cùng của trang mà hàm được gọi. Cú pháp hàm Getlastmod():

int getlastmod(void)

Giá trị trả về tuân theo định dạng ngày/giờ UNIX và bạn có thể sử dụng hàm date() để định dạng nó. Đoạn mã sau hiển thị ngày trang được sửa đổi lần cuối:

echo "Sửa đổi lần cuối: ".date("H:i:s a". getlastmod());

Hàm stat() trả về một mảng có thể lập chỉ mục với thông tin chi tiết về tệp có tên đã cho:

chỉ số mảng (tên tệp chuỗi)

Thông tin sau được trả về trong các phần tử mảng:

0 thiết bị

2 Chế độ bảo vệ nút chỉ mục

3 Số lượng liên kết

4 ID người dùng của chủ sở hữu

5 ID nhóm chủ sở hữu

6 Loại thiết bị nút chỉ mục

7 Kích thước tính bằng byte

8 Thời gian của cuộc gọi cuối cùng

9 Thời gian sửa đổi lần cuối

10 Lần sửa đổi cuối cùng

11 Kích thước khối cho I/O hệ thống tệp

12 Số khối được phân bổ

Vì vậy, nếu bạn muốn biết lần cuối cùng một tệp được truy cập là khi nào, hãy xem phần tử 8 của mảng được trả về. Hãy xem một ví dụ:

$file - "datafile.txt";

danh sách($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $size, $atime, $mtime, $ctime,

$bsize) = stat($file);

print "$file có kích thước $byte.
";

print "Lần truy cập cuối cùng: $atime
";

print "Thời gian sửa đổi lần cuối: $mtime
";

Kết quả:

popen.php là 289 byte.

Lần truy cập cuối cùng: 15 tháng 8 năm 2000 12:00:00

Lần sửa đổi cuối cùng: 15 tháng 8 năm 2000 10:07:18

Trong ví dụ này, tôi đã sử dụng cấu trúc list() để gán tên cho từng giá trị trả về. Tất nhiên, bạn có thể dễ dàng trả về một mảng, lặp qua các phần tử và hiển thị tất cả thông tin cần thiết. Như bạn có thể thấy, hàm stat() cho phép bạn nhận được nhiều thông tin hữu ích khác nhau về một tệp.

Hiển thị và thay đổi đặc điểm tập tin

Mỗi tệp trên hệ thống họ UNIX có ba đặc điểm quan trọng:

  • thuộc về một nhóm;
  • người sở hữu;
  • quyền.

Tất cả những đặc điểm này có thể được thay đổi bằng cách sử dụng các hàm PHP thích hợp. Các tính năng được mô tả trong phần này không hoạt động trên các hệ thống thuộc dòng Windows.

Nếu bạn không có kinh nghiệm với hệ điều hành UNIX, bạn có thể tìm thấy thông tin về các đặc điểm của hệ thống tệp UNIX tại http://sunsite.auc.dk/linux-newbie/FAQ2.htm. Các chủ đề về thành viên nhóm, quyền sở hữu và quyền được thảo luận trong Phần 3.2.6.

Hàm chgrp() cố gắng thay đổi nhóm chứa tệp đã cho. Cú pháp hàm chgrp():

int chgrp (tên tệp chuỗi, nhóm hỗn hợp)

Hàm filegroup() trả về ID nhóm của chủ sở hữu tệp có tên đã cho hoặc FALSE nếu có lỗi. Cú pháp hàm Filegroup():

int filegroup (tên tệp chuỗi)

Hàm chmod() thay đổi quyền của tệp có tên đã cho. Cú pháp hàm chmod():

int chmod (tên tệp chuỗi, quyền int)

Quyền được chỉ định trong ký hiệu bát phân. Chi tiết cụ thể về việc đặt tham số cho hàm chmod() được minh họa trong ví dụ sau:

chmod("data_file.txt", g+r); // Không hoạt động

chmod("data_file.txt", 766); // Không hoạt động

chmod("data_file.txt", 0766); // Làm

Hàm fileperms() trả về quyền của tệp có tên đã cho hoặc FALSE nếu có lỗi. Cú pháp hàm Fileperms():

int fileperms (tên tệp chuỗi)

Hàm chown() cố gắng thay đổi chủ sở hữu của tệp. Quyền thay đổi chủ sở hữu của tệp được giới hạn ở người dùng có đặc quyền. Cú pháp hàm chown():

int chown (tên tệp chuỗi, người dùng hỗn hợp)

Hàm fileowner() trả về ID người dùng của chủ sở hữu tệp có tên đã cho. Cú pháp hàm Fileowner():

int fileowner (tên tệp chuỗi)

Sao chép và đổi tên tập tin

Các chức năng hệ thống hữu ích khác có thể được thực hiện trong các tập lệnh PHP bao gồm sao chép và đổi tên tệp trên máy chủ. Các thao tác này được thực hiện bởi hai hàm: copy() và đổi tên().

Sao chép một tập tin trong tập lệnh PHP không khó hơn việc sử dụng lệnh UNIX cf. Vấn đề được giải quyết bằng hàm PHP copy(). Cú pháp của hàm soru() là:

bản sao int (chuỗi nguồn, đích chuỗi)

Hàm copy() cố gắng sao chép tệp nguồn sang tệp đích; trả về TRUE nếu thành công, FALSE nếu thất bại. Nếu tệp đích không tồn tại, hàm copy() sẽ tạo nó. Ví dụ sau đây cho thấy cách tạo bản sao lưu của tệp bằng hàm copy():

$data_file = "data.txt";

copy($data_file. $data_file".bak") hoặc die("Không thể sao chép $data_file");

Hàm đổi tên () đổi tên một tập tin. Nếu thành công thì trả về TRUE, nếu không thành công thì trả về FALSE. Cú pháp hàm Rename():

đổi tên bool (chuỗi old_name, chuỗi new_name)

Một ví dụ về đổi tên tệp bằng hàm đổi tên():

$data_file = "data.txt";

đổi tên ($tệp dữ liệu, $datafile".old") hoặc die("Không thể đổi tên tệp dữ liệu $");

Xóa tập tin

Hàm unlink() xóa một file có tên đã cho. Cú pháp:

int hủy liên kết (tệp chuỗi)

Nếu bạn đang làm việc với PHP trên hệ thống Windows, đôi khi bạn có thể gặp sự cố khi sử dụng tính năng này. Trong trường hợp này, bạn có thể sử dụng hàm system() được mô tả ở trên và xóa tệp bằng lệnh DOS del:

system("del filename.txt");

Làm việc với danh mục

Các hàm PHP cho phép bạn xem và điều hướng nội dung của các thư mục. Liệt kê 7.8 cho thấy một cấu trúc thư mục điển hình trên hệ thống UNIX.

Liệt kê 7.8. Cấu trúc thư mục điển hình

Hàm dirname() bổ sung cho basename() - nó trích xuất đường dẫn từ tên tệp đủ điều kiện. Cú pháp của hàm dirname() là:

chuỗi dirname (đường dẫn chuỗi)

Một ví dụ về việc sử dụng dirname() để trích xuất đường dẫn từ tên đầy đủ:

$path = "/usr/locla/phppower/htdocs/index.php";

$file = dirname($path); // $file = "usr/local/phppower/htdocs"

Hàm dirname() đôi khi được sử dụng kết hợp với biến $SCRIPT_FILENAME để lấy đường dẫn đầy đủ đến tập lệnh mà lệnh được thực thi từ đó:

$dir - tên dir($SCRIPT_FILENAME);

Hàm is_dir() kiểm tra xem tệp có tên cụ thể có phải là thư mục hay không:

bool is_dir (tên tệp chuỗi)

Ví dụ sau sử dụng cấu trúc thư mục từ Liệt kê 7.8:

$ isdir = is_dir("index.html"); // Trả về SAI

$isdir = is_dir("cuốn sách"); // Trả về ĐÚNG

Hàm mkdir() thực hiện tương tự như lệnh UNIX cùng tên - nó tạo một thư mục mới. Cú pháp hàm mkdir():

int mkdir (đường dẫn chuỗi, chế độ int)

Tham số đường dẫn chỉ định đường dẫn để tạo thư mục mới. Đừng quên kết thúc tham số bằng tên của thư mục mới! Tham số chế độ xác định các quyền được gán cho thư mục đã tạo.

Giống như hàm fopen() mở một trình thao tác để làm việc với một tệp nhất định, hàm opendir() sẽ mở một trình thao tác để làm việc với một thư mục. Cú pháp của hàm opendir() là:

int opendir (đường dẫn chuỗi)

Hàm Closeir() đóng phần xử lý thư mục được truyền dưới dạng tham số. Cú pháp hàm closeir() là:

void closeir(int thư mục_manipulator)

Hàm readdir() trả về phần tử tiếp theo của thư mục đã chỉ định. Cú pháp:

chuỗi readdir(int thư mục_manipulator)

Sử dụng chức năng này, bạn có thể dễ dàng liệt kê tất cả các tệp và thư mục con nằm trong thư mục hiện tại:

$dh = opendir(" .);

while ($file = readdir($dh)) :

in "tập tin $
"; cuối cùng;

Hàm chdir() hoạt động giống như lệnh UNIX cd; nó thay đổi thư mục được chỉ định bởi tham số. Cú pháp hàm chdir():

int chdir (thư mục chuỗi)

Trong ví dụ sau, chúng ta điều hướng đến thư mục con book/ và in nội dung của nó:

$newdir = "cuốn sách";

chdir($newdir) hoặc die("Không thể thay đổi thư mục ($newdir)"); $dh = opendir(" . ");

while ($file = readdir($dh)) ;

in "tập tin $
";

Hàm rewlnddir() di chuyển con trỏ vị trí hiện tại đến đầu thư mục được mở bởi hàm opendir(). Cú pháp hàm rewinddir() là:

void tua lại (int thư mục_manipulator)

Project 1: Bộ đếm hit đơn giản

Kịch bản được trình bày trong phần này đếm số lần truy cập vào trang có nó. Trước khi chuyển sang mã trong Liệt kê 7.9, hãy xem lại thuật toán được viết bằng mã giả:

  1. Gán biến $access tên của tệp trong đó giá trị bộ đếm sẽ được lưu trữ.
  2. Sử dụng hàm file() để đọc nội dung của $access vào mảng $visits. Tiền tố @ trước tên hàm sẽ ngăn chặn các lỗi có thể xảy ra (ví dụ: không có tệp nào có tên đã cho).
  3. Đặt biến $current_visitors thành giá trị của phần tử đầu tiên (và duy nhất) của mảng $visits.
  4. Tăng giá trị $current_visitors lên 1.
  5. Mở tệp $access để ghi và đặt con trỏ vị trí hiện tại về đầu tệp.
  6. Viết giá trị $current_visitors vào tệp $access.
  7. Đóng trình thao tác tham chiếu tệp $access.

Liệt kê 7.9. Bộ đếm lượt truy cập đơn giản

// Script: bộ đếm lượt truy cập đơn giản

// Mục đích: lưu số lần truy cập trong một file

$access = "hits.txt"; // Tên file được chọn tùy ý

$current_visitors = $lượt truy cập; // Truy xuất phần tử đầu tiên (và duy nhất)

+$current_visitors; // Tăng bộ đếm lượt truy cập

$fh = fopen($access. "w"); // Mở file hit.txt và cài đặt

// con trỏ tới vị trí hiện tại ở đầu file

@fwrite($fh, $current_visitors);// Viết giá trị bộ đếm mới

// vào file "hits.txt"

fclose($fh); // Đóng trình xử lý file "hits.txt"

Dự án 2: xây dựng sơ đồ trang web

Tập lệnh trong Liệt kê 7.10 xây dựng một sơ đồ trang web, một chế độ xem phân cấp của tất cả các thư mục và tệp trên máy chủ, bắt đầu từ một thư mục nhất định. Việc tính toán khoảng đệm của các phần tử tạo nên sơ đồ trang web sử dụng các hàm được xác định trong chương này và các chương trước. Trước khi chuyển sang chương trình, hãy xem lại thuật toán được viết bằng mã giả:

  1. Khai báo các biến dịch vụ để lưu trữ thư mục mẹ, tên file đồ họa kèm theo hình ảnh của thư mục, tên trang và cờ hệ điều hành máy chủ (Windows hoặc hệ thống khác).
  2. Khai báo hàm display_directory() để đọc nội dung của một thư mục và định dạng nó để hiển thị trên trình duyệt.
  3. Xây dựng đường dẫn thư mục bằng cách kết hợp tên được truyền trong biến $dir1 với $dir.
  4. Mở một thư mục và đọc nội dung của nó. Định dạng tên thư mục và tập tin và hiển thị chúng trong trình duyệt.
  5. Nếu tệp hiện tại là một thư mục, hãy gọi đệ quy display_di rectory() và chuyển cho nó tên của thư mục mới để hiển thị. Tính toán thụt lề được sử dụng khi định dạng đầu ra.

Nếu tệp không phải là một thư mục, nó sẽ được định dạng để hiển thị dưới dạng siêu liên kết (và độ thụt lề được sử dụng trong định dạng cũng được tính toán).

Liệt kê 7.10. Chương trình Sitemap.php

// Tập tin: sitemap.php

// Mục đích: xây dựng sơ đồ trang web

// Thư mục bắt đầu xây dựng bản đồ

$beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";

// Tệp có hình ảnh đồ họa của thư mục.

// Đường dẫn phải tương đối* với thư mục gốc của máy chủ Apache

$folder_location = "C:\Tài liệu của tôi\PHP dành cho lập trình viên\CHPS CUỐI CÙNG\graphics\folder.gif";

// Văn bản trong tiêu đề cửa sổ $page_name = "PHPRecipes SiteMap";

// Tập lệnh sẽ được sử dụng trên hệ thống nào - Linux hay Windows?

// (0 - Windows; 1 - Linux)

$usingjinux = 0;

// Chức năng: display_directory

// Mục đích: đọc nội dung của thư mục được chỉ định bởi tham số

// $dir1, theo sau là định dạng phân cấp thư mục và tập tin.

// Hàm có thể được gọi đệ quy.

hàm display_directory ($dir1, $folder_location, $using_linux, $init_deep) (

// Cập nhật đường dẫn

Sdh = opendir($dir);

while($file = readdir($dh)) :

// Các phần tử thư mục "." và ".." không được hiển thị.

if (($file != ".") && ($file != "..")) :

nếu ($using_linux == 0):

$deep = nổ("\\", $dir): else:

$độ sâu = nổ("/", $dir); kết thúc ; $curtent_deep = sizeof($deep);

// Xây dựng đường dẫn theo quy tắc của hệ điều hành được sử dụng. nếu ($using_linux == 0):

$tab_deep = $current_deptn - $init_deep;

$file = $dir. "\\", $file; khác:

$file = $dir. "/",$file; cuối cùng;

// $file có chứa thư mục không? if (là dir($file)) :

// Tính toán thụt lề

trong khi ($x< ($tab_depth * 2)) :

$x++; cuối cùng;

in "

".basename ($tệp)."
";

// Bộ đếm tăng dần

// Lệnh gọi đệ quy tới display_directory()

display_directory($file, $folder_location, $using_linux, $init_deep);

// Không phải là thư mục

// Xây dựng đường dẫn theo quy tắc đã sử dụng

// hệ điều hành.

nếu ($using_linux == 0):

$tab_deep = ($current_deep - $init_deep) - 2; $x = 0;

// Tính toán thụt lề

trong khi ($x< (($tab_depth * 2) + 5)) :

in " ".basename ($tệp)."
";

in " ".basename ($tệp)."
";

cuối cùng; // Is_dir(file) endif: // If ! "." hoặc ".."

// Đóng thư mục Closer($dh);

<? print "$page_name"; ?>

// Tính toán phần đệm ban đầu

nếu ($using_linux == 0):

$độ sâu = nổ("\\", $beg_path);

$độ sâu = nổ("/", $beg_path);

$init_deep = sizeof($deep);

display_directory($beg_path, $folder_location, $using_linux, $init_deep);

Trong bộ lễ phục. Hình 7.1 cho thấy kết quả của việc chạy tập lệnh trên một thư mục chứa nhiều chương của cuốn sách này.

Cơm. 7.1. Hiển thị cấu trúc thư mục trên máy chủ bằng tập lệnh sitemap.php

Kết quả

Chương này đã giới thiệu nhiều công cụ của PHP để làm việc với các tệp. Đặc biệt, chúng tôi đã xem xét các vấn đề sau:

  • kiểm tra sự tồn tại của tập tin;
  • mở và đóng các tập tin và luồng I/O;
  • ghi và đọc từ một tập tin;
  • chuyển hướng tập tin đến luồng đầu ra;
  • triển khai các chương trình bên ngoài;
  • hoạt động của hệ thống tập tin.

Tài liệu trong chương này tạo tiền đề cho chương tiếp theo, “Chuỗi và biểu thức chính quy”, bởi vì khi phát triển ứng dụng web, việc xử lý chuỗi và các thao tác I/O có liên quan rất chặt chẽ với nhau.

Về cách sử dụng các hàm fopen, fclose, feof, fgets, fgetss, fscanf

Hãy liệt kê tất cả các khả năng

Một trong những lợi ích khi làm việc với các ngôn ngữ lập trình hiện đại như PHP là số lượng tính năng có sẵn. PHP có thể dễ dàng áp dụng phương châm của Perl, "Có nhiều cách để làm điều gì đó", đặc biệt khi nói đến xử lý tệp. Nhưng với vô số công cụ có sẵn, câu hỏi đặt ra là công cụ nào là tốt nhất để hoàn thành công việc. Tất nhiên, câu trả lời cho câu hỏi này thực sự phụ thuộc vào mục tiêu của bạn khi xử lý tệp, vì vậy việc học tất cả các khả năng của ngôn ngữ này rất đáng để bạn dành thời gian.

Phương pháp fopen truyền thống

Các phương thức fopen có lẽ quen thuộc nhất với các lập trình viên C và C++ ngày xưa, vì chúng ít nhiều là những công cụ đã có trong tầm tay bạn trong nhiều năm nếu bạn đã làm việc với các ngôn ngữ lập trình đó. Đối với bất kỳ phương pháp nào trong số này, bạn làm theo quy trình chuẩn, sử dụng fopen để mở tệp, một hàm để đọc dữ liệu và sau đó fclose để đóng tệp, như trong Liệt kê 1.

Liệt kê 1. Mở và đọc một tệp bằng fgets
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) ( $line = fgets($file_handle); echo $line; ) fclose($file_handle);

Mặc dù những hàm này quen thuộc với hầu hết các lập trình viên giàu kinh nghiệm nhưng hãy để tôi phân tích cách chúng hoạt động. Trong thực tế, bạn đang làm theo các bước sau:

  1. Mở tập tin. $file_handle lưu trữ một liên kết đến chính tệp đó.
  2. Kiểm tra xem bạn đã đến cuối tập tin chưa.
  3. Tiếp tục đọc tệp cho đến hết, in từng dòng bạn đọc.
  4. Đóng tập tin.

Với ý nghĩ đó, tôi sẽ xem xét từng chức năng tệp được sử dụng ở đây.

hàm fopen

Hàm fopen thiết lập kết nối tới một tập tin. Tôi nói "thiết lập kết nối" vì ngoài việc mở tệp, fopen còn có thể mở URL:

$fh = fopen("http://127.0.0.1/", "r");

Dòng chương trình này tạo một liên kết đến trang trên và cho phép bạn bắt đầu đọc nó dưới dạng tệp cục bộ.

Ghi chú: Tùy chọn "r" được sử dụng trong fopen cho biết tệp đang mở ở chế độ chỉ đọc. Vì việc ghi vào tệp không nằm trong phạm vi vấn đề được thảo luận trong bài viết này nên tôi sẽ không liệt kê tất cả các giá trị có thể có của tham số. Tuy nhiên, bạn cần thay đổi "r" thành "rb" nếu bạn đang đọc từ tệp nhị phân để có khả năng tương thích đa nền tảng. Dưới đây là một ví dụ về loại này.

chức năng giả

Lệnh feof xác định xem quá trình đọc đã đến cuối tệp hay chưa và trả về Đúng hay Sai. Vòng lặp hiển thị tiếp tục cho đến hết tệp "myfile." Lưu ý rằng feof cũng trả về Sai nếu bạn đang đọc một URL và kết nối hết thời gian vì không còn dữ liệu để đọc.

chức năng fclose

Hãy bỏ qua phần giữa của Liệt kê 1 và đi đến cuối; fclose thực hiện ngược lại với fopen: nó đóng kết nối tới tệp hoặc URL. Sau khi thực hiện chức năng này, bạn sẽ không thể đọc từ tệp hoặc ổ cắm nữa.

chức năng fget

Quay lại một vài dòng trong Liệt kê 1, bạn sẽ đi vào trọng tâm của quá trình xử lý tệp: thực sự là đọc tệp. Hàm fgets là vũ khí bạn lựa chọn trong ví dụ đầu tiên. Nó lấy một dòng dữ liệu từ một tệp và trả về dưới dạng một chuỗi. Từ đó bạn có thể hiển thị dữ liệu hoặc xử lý dữ liệu đó. Ví dụ trong Liệt kê 1 in toàn bộ tệp.

Nếu bạn quyết định giới hạn kích thước của đoạn dữ liệu mà bạn làm việc, bạn có thể thêm đối số fgets để giới hạn độ dài tối đa của chuỗi dữ liệu được thu thập. Ví dụ: sử dụng mã sau để giới hạn độ dài của một dòng ở mức 80 ký tự:

$string = fgets($file_handle, 81);

Hãy nghĩ đến "\0", chỉ báo cuối dòng trong C và đặt độ dài thành một ký tự dài hơn mức bạn thực sự cần. Như bạn có thể thấy, ví dụ trên sử dụng 81, trong khi bạn cần 80 ký tự. Hãy tạo thói quen thêm một ký tự phụ bất cứ khi nào bạn cần đặt giới hạn độ dài dòng cho một hàm nhất định.

chức năng fread

Hàm fgets chỉ là một trong nhiều hàm có sẵn để đọc tệp. Đây là một trong những hàm được sử dụng phổ biến nhất vì việc xử lý từng dòng tệp trong hầu hết các trường hợp là hợp lý nhất. Trên thực tế, một số tính năng khác cũng có khả năng tương tự. Tuy nhiên, phân tích từng dòng không phải lúc nào cũng là thứ bạn cần.

Và ở đây chúng tôi truy cập fread . Hàm fread có mục đích hơi khác so với fgets: nó nhằm mục đích đọc từ các tệp nhị phân (nghĩa là các tệp ban đầu không bao gồm văn bản mà con người có thể đọc được). Vì khái niệm "dòng" không liên quan đến tệp nhị phân (cấu trúc dữ liệu logic thường không được chia thành dòng), nên bạn phải chỉ định số byte cần đọc.

$fh = fopen("myfile", "rb"); $data = fread($file_handle, 4096);

Ví dụ trên đọc 4096 byte (4 KB) dữ liệu. Lưu ý rằng, bất kể giá trị bạn chỉ định, fread sẽ đọc tối đa 8192 byte (8 KB).

Giả sử tệp không lớn hơn 8 KB, đoạn mã chương trình bên dưới sẽ đọc toàn bộ tệp trong một dòng.

$fh = fopen("myfile", "rb"); $data = fread($fh, filesize("myfile")); fclose($fh);

Nếu kích thước tệp lớn hơn, bạn sẽ phải sử dụng vòng lặp để đọc phần còn lại của tệp.

hàm fscanf

Quay trở lại xử lý chuỗi, fscanf cũng là sự kế thừa của hàm thư viện tệp C truyền thống. Nếu bạn không quen với nó, fscanf sẽ đọc các trường dữ liệu thành các biến từ một tệp.

danh sách ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");

Các chuỗi định dạng được sử dụng trong hàm này được mô tả trong nhiều nguồn như PHP.net, vì vậy tôi sẽ không lặp lại thông tin này ở đây. Chỉ cần nói rằng định dạng chuỗi rất linh hoạt. Cũng cần đề cập rằng tất cả các trường được đặt trong biến được hàm trả về. (Trong C, những thứ này sẽ được chuyển dưới dạng đối số.)

chức năng fgetss

Hàm fgetss khác với các hàm thao tác tệp truyền thống và giúp bạn hiểu rõ hơn về các khả năng của PHP. Nó hoạt động giống như fget, nhưng loại bỏ mọi thẻ HTML hoặc PHP mà nó phát hiện được, chỉ để lại văn bản trần. Hãy lấy tệp HTML bên dưới.

Liệt kê 2. Tệp HTML ví dụ
Tiêu đề của tôi

Nếu bạn hiểu câu "Vì chẳng có ai cho bạn nỗi đau" nghĩa là bạn nghe nhạc America nhiều quá rồi.

Hãy chuyển nó qua hàm fgetss.

Liệt kê 3. Sử dụng fgetss
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) ( echo = fgetss($file_handle); ) fclose($file_handle);

Đây là những gì bạn sẽ nhận được dưới dạng đầu ra:

Tiêu đề của tôi Nếu bạn hiểu ý nghĩa của "Vì không có ai cho bạn nỗi đau" nghĩa là bạn đã nghe quá nhiều về ban nhạc America

hàm fpassthru

Bất kể bạn đọc dữ liệu từ tệp bằng cách nào, bạn có thể in dữ liệu còn lại bằng kênh đầu ra tiêu chuẩn bằng chức năng fpassthru.

fpassthru($fh);

Hàm này in dữ liệu nên bạn không cần phải đặt nó vào một biến.

Xử lý tệp phi tuyến tính: di chuyển qua một tệp

Tất nhiên, các chức năng được mô tả ở trên chỉ cho phép bạn đọc tuần tự từ một tệp. Các tệp phức tạp hơn có thể yêu cầu di chuyển đến các phần khác nhau của tệp ở đầu hoặc cuối tệp. Để làm được điều này bạn cần có hàm fseek.

fseek($fh, 0);

Ví dụ trên quay lại phần đầu của tập tin. Nếu bạn không muốn di chuyển đến phần đầu của tệp - chẳng hạn, một kilobyte là đủ - bạn chỉ cần viết:

fseek($fh, 1024);

Kể từ PHP V4.0, một số tùy chọn khác cũng có sẵn. Ví dụ: nếu bạn cần di chuyển về phía trước 100 byte từ vị trí hiện tại của mình, bạn có thể sử dụng mã sau:

fseek($fh, 100, SEEK_CUR);

Tương tự, việc di chuyển trở lại 100 byte được thực hiện bằng cách:

fseek($fh, -100, SEEK_CUR);

Nếu bạn muốn quay lại vị trí 100 byte trước khi kết thúc tệp, hãy sử dụng SEEK_END thay thế.

fseek($fh, -100, SEEK_END);

Khi đạt đến vị trí mới, bạn có thể sử dụng fgets, fscanf hoặc chức năng khác để đọc dữ liệu.

Ghi chú: bạn không thể sử dụng fseek trên các bộ mô tả tệp tham chiếu URL.

Chụp toàn bộ tập tin

Bây giờ chúng ta chuyển sang xem xét một số khả năng xử lý tệp độc đáo của PHP: xử lý các khối dữ liệu lớn trong một hoặc hai dòng. Ví dụ: làm cách nào bạn có thể lấy một tệp và hiển thị toàn bộ nội dung của nó trên trang Web của mình? Chà, bạn đã thấy một ví dụ về cách sử dụng vòng lặp với fgets. Nhưng làm thế nào bạn có thể làm cho nó dễ dàng hơn? Quá trình này gần như dễ dàng đến mức nực cười khi sử dụng fgetcontents, cách này sẽ đặt toàn bộ tệp trên một dòng.

$my_file = file_get_contents("myfilename"); echo $my_file;

Mặc dù đây không phải là lựa chọn tốt nhất nhưng bạn có thể viết lệnh này thậm chí còn ngắn hơn:

echo file_get_contents("myfilename");

Bài viết này chủ yếu tập trung vào việc xử lý các tệp cục bộ, tuy nhiên, điều đáng chú ý là bạn cũng có thể chụp, hiển thị và phân tích các trang Web khác bằng cách sử dụng các chức năng được mô tả.

echo file_get_contents("http://127.0.0.1/");

Lệnh này thực sự giống như:

$fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh);

Bạn có thể nhìn vào những ví dụ này và nghĩ, "Có rất nhiều việc phải làm." Các nhà phát triển PHP đồng ý với bạn. Vì vậy, bạn có thể rút ngắn lệnh trên thành:

readfile("http://127.0.0.1/");

Hàm readfile xuất toàn bộ nội dung của một tệp hoặc trang Web vào bộ đệm đầu ra mặc định. Theo mặc định, lệnh này hiển thị thông báo lỗi khi thất bại. Để tránh hành vi này (nếu bạn muốn), hãy thử lệnh:

@readfile("http://127.0.0.1/");

Tất nhiên, nếu bạn cần xử lý nội dung của tệp thì một dòng được trả về bởi file_get_contents có thể là quá nhiều. Trước tiên, bạn có thể muốn chia nó thành nhiều phần bằng hàm Split().

$array = Split("\n", file_get_contents("myfile"));

Nhưng tại sao bạn lại cần tất cả sự phức tạp này nếu có một chức năng hoàn toàn phù hợp sẽ thực hiện công việc cho bạn? Hàm PHP file() hoàn thành nhiệm vụ này trong một bước: nó trả về một mảng chuỗi có các phần tử là các dòng của tệp.

$array = file("myfile");

Cần lưu ý rằng có một chút khác biệt giữa hai ví dụ trên. Lệnh tách sẽ loại bỏ các dòng mới, trong khi lệnh file kết thúc các dòng mảng bằng các dòng mới (cũng như fgets).

Tuy nhiên, khả năng của PHP vượt xa những khả năng được mô tả ở trên. Bạn có thể phân tích toàn bộ tệp .ini theo kiểu PHP chỉ bằng một lệnh pars_ini_file. Lệnh Parse_ini_file áp dụng cho các tệp tương tự như các tệp được hiển thị trong Liệt kê 4.

Liệt kê 4. Ví dụ về tệp .ini
; Tên nhận xét = Nhiệm vụ "Vua Arthur" = Đi tìm màu sắc yêu thích của chén thánh = Blue Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

Các lệnh sau biểu thị một tệp dưới dạng một mảng và sau đó in mảng:

$file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;

Kết quả sẽ là đầu ra sau:

Liệt kê 5. Đầu ra
Mảng ( => Vua Arthur => Đi tìm Chén Thánh => Xanh lam => Mark Twain => Whoopi Goldberg)

Tất nhiên, bạn có thể nhận thấy lệnh này đã hợp nhất các phần. Đây là hành động mặc định nhưng bạn có thể dễ dàng tùy chỉnh nó bằng cách sử dụng đối số thứ hai của pars_ini_file: process_sections, là một biến Boolean. Đặt process_sections thành True.

$file_array = parse_ini_file("holy_grail.ini", true); print_r $file_array;

Và đầu ra của bạn sẽ trông như sau:

Liệt kê 6. Đầu ra
Mảng ( => Mảng ( => Vua Arthur => Đi tìm Chén Thánh => Xanh lam) => Mảng ( => Mark Twain => Whoopi Goldberg))

PHP đặt dữ liệu vào một mảng đa chiều có thể phân tích cú pháp dễ dàng.

Nhưng đây chỉ là phần nổi của tảng băng chìm khi xử lý tệp trong PHP. Các hàm phức tạp hơn như gọn gàng_parse_file và xml_parse có thể giúp bạn phân tích cú pháp các tài liệu HTML và XML tương ứng. Tham khảo phần này để biết thêm thông tin chi tiết về cách hoạt động của các chức năng này. Cả hai điều này đều đáng để cân nhắc nếu bạn định làm việc với các loại tệp này, nhưng thay vì xem qua tất cả các loại tệp có thể, bạn có thể muốn xem xét kỹ hơn nội dung của bài viết này, trong đó có một số quy tắc chung hữu ích cho làm việc với các chức năng mà tôi đã mô tả cho đến nay.

Phong cách lập trình tốt

Đừng bao giờ cho rằng mọi thứ trong chương trình của bạn sẽ hoạt động như dự kiến. Ví dụ: nếu tập tin bạn đang tìm kiếm đã bị di chuyển thì sao? Điều gì sẽ xảy ra nếu việc thay đổi quyền khiến bạn không thể đọc được nội dung của tệp? Bạn có thể kiểm tra sự tồn tại của tệp và quyền đọc trước tệp đó bằng cách sử dụng các phương thức file_exists và is_readable.

Liệt kê 7. Sử dụng file_exists và is_readable
$filename = "myfile"; if (file_exists($filename) && is_readable ($filename)) ( $fh = fopen($filename, "r"); # Đang xử lý fclose($fh); )

Tuy nhiên, trên thực tế, phần chương trình này có thể sẽ quá mức cần thiết cho nhiệm vụ của bạn. Việc xử lý các giá trị được fopen trả về đơn giản và chính xác hơn.

if ($fh = fopen($filename, "r")) ( # Đang xử lý fclose($fh); )

Vì fopen trả về Sai nếu thất bại, điều này sẽ đảm bảo rằng tệp sẽ chỉ được xử lý nếu tệp có thể mở được. Tất nhiên, nếu tệp không tồn tại hoặc không thể đọc được, bạn sẽ mong đợi giá trị trả về là số âm. Vì vậy, việc kiểm tra như vậy là một cái bẫy mà mọi vấn đề tiềm ẩn đều rơi vào. Ngoài ra, bạn có thể thoát khỏi chương trình hoặc hiển thị thông báo lỗi nếu không mở được file.

Giống như fopen, các hàm file_get_contents, file và readfile trả về Sai nếu không thể mở hoặc xử lý tệp. Các hàm fgets, fgetss, fread, fscanf và fclose cũng trả về Sai nếu xảy ra lỗi. Tất nhiên, ngoại trừ fclose , có thể bạn đã xử lý kết quả mà chúng trả về. Đối với fclose , không thể làm được gì nhiều nếu phần xử lý tệp không đóng đúng cách, vì vậy việc kiểm tra giá trị trả về của fclose nói chung là quá mức cần thiết.

Sự lựa chọn là của bạn

PHP không thiếu những cách hiệu quả để đọc và phân tích tệp. Các hàm cổ điển như fread có thể phục vụ bạn một cách đáng tin cậy trong hầu hết thời gian hoặc bạn có thể bị thu hút nhiều hơn bởi tính đơn giản của readfile nếu đó là điều bạn cần để hoàn thành công việc. Sự lựa chọn thực sự phụ thuộc vào những gì bạn đang cố gắng thực hiện.

Nếu bạn đang xử lý một lượng lớn dữ liệu, bạn có thể sẽ thấy fscanf hữu ích và hiệu quả hơn việc sử dụng tệp kết hợp với các lệnh phân tách và chạy nước rút tiếp theo. Tuy nhiên, nếu bạn chỉ hiển thị một lượng lớn văn bản với những thay đổi nhỏ thì việc sử dụng các hàm file , file_get_contents hoặc readfile có thể có ý nghĩa hơn. Giải pháp này có thể sẽ đúng khi sử dụng PHP để lưu vào bộ đệm hoặc thậm chí tạo máy chủ proxy tạm thời.

PHP cung cấp nhiều công cụ để làm việc với các tập tin. Tìm hiểu rõ hơn về từng công cụ và tìm ra công cụ nào phù hợp nhất cho dự án bạn đang thực hiện. Bạn được cung cấp nhiều lựa chọn công cụ phần mềm, sử dụng chúng một cách hiệu quả nhất và tận hưởng niềm vui khi xử lý các tệp của mình bằng PHP.

PHP - Làm việc với các tập tin

Mọi lập trình viên đều có thể làm việc với các tập tin một cách chính xác. Bài viết này nhắm đến những người mới bắt đầu lập trình PHP, nhưng “bộ sưu tập các công thức nấu ăn” cũng sẽ hữu ích cho những người dùng nâng cao.

Làm việc với các tập tin được chia thành 3 giai đoạn:

  • Đang mở một tập tin.
  • Thao tác dữ liệu.
  • Đóng tập tin.

I. Mở một tập tin

Để mở tệp trong PHP, hãy sử dụng hàm fopen(). Các tham số bắt buộc cho chức năng này là tên tệp và chế độ tệp.

Theo tài liệu PHP, các loại chế độ tệp sau đây được phân biệt:

  • r – mở file ở chế độ chỉ đọc.
  • r+ - mở một tập tin để đọc và viết cùng một lúc.
  • w – tạo một tập tin trống mới. Nếu một tập tin như vậy đã tồn tại tại thời điểm cuộc gọi, nó sẽ bị hủy.
  • w+ - tương tự như r+, chỉ khi tệp tồn tại tại thời điểm gọi thì nội dung của nó sẽ bị xóa.
  • a – mở một tệp hiện có ở chế độ ghi, với con trỏ được dịch chuyển đến byte cuối cùng của tệp (đến cuối tệp).
  • a+ - mở tệp ở chế độ đọc-ghi, với con trỏ được dịch chuyển đến byte cuối cùng của tệp (đến cuối tệp). Nội dung của tập tin không bị xóa.

Lưu ý: Có thể có thêm một tham số tùy chọn ở cuối bất kỳ dòng nào: b hoặc t. Nếu b được chỉ định, tệp sẽ được mở ở chế độ đọc/ghi nhị phân. Nếu t thì chế độ dịch nguồn cấp dòng được đặt cho tệp, tức là. nó được coi là văn bản.

Để chứng minh, hãy xem xét tình huống sau:

//Mở một file ở các chế độ khác nhau

$fp = fopen("counter.txt", "r"); // Chế độ nhị phân

$fp = fopen("counter.txt", "rt"); // Chế độ văn bản

$fp = fopen("http://www.yandex.ru", "r");// Mở kết nối HTTP để đọc

$fp = fopen("ftp://user: [email được bảo vệ]", "w"); //Mở kết nối FTP cho biết thông tin đăng nhập và mật khẩu

II. Thao tác dữ liệu tệp

Bạn có thể ghi dữ liệu vào một tệp bằng PHP bằng hàm fwrite(). Hàm này có 2 tham số bắt buộc và 1 tham số tùy chọn. Các tham số bắt buộc là bộ mô tả tệp và chế độ tệp:

$fp = fopen("counter.txt", "a"); //Mở file ở chế độ ghi

$mytext = "Chúng ta cần viết dòng này\r\n"; // Chuỗi nguồn

$test = fwrite($fp, $mytext); // Ghi vào tập tin

Nếu ($ kiểm tra)

Echo "Dữ liệu đã được nhập vào tập tin thành công.";

Khác

Echo "Lỗi ghi vào tập tin.";

Fclose($fp); //Đóng tập tin

Để đọc từng dòng tệp, hãy sử dụng hàm fgets(). Hàm này có 2 tham số bắt buộc:

Nếu ($fp)

Trong khi (!feof($fp))

$mytext = fgets($fp, 999);

Echo $mytext."
";

Khác

Fclose($fp);

Lưu ý: Trong ví dụ này, giá trị 999 chỉ định số lượng ký tự sẽ được đọc cho đến khi con trỏ chạm đến cuối tệp (EOF).

Echo readfile("counter.txt");

Bạn cũng có thể sử dụng hàm fpassthru() có 1 tham số bắt buộc. Trước khi sử dụng tính năng này, bạn phải mở tệp ở chế độ Đọc. Khi đọc xong tệp, hàm sẽ tự động đóng tệp (và bộ mô tả tệp sẽ không hợp lệ).

$fp = fopen("counter.txt", "r"); //Mở file ở chế độ đọc

Nếu ($fp)

Echo fpassthru($fp);

Khác

Echo "Lỗi mở tập tin";

Rất thường xuyên có những tình huống cần phải đọc nội dung của một trang web thành một mảng. Tính năng này liên quan đến việc sử dụng hàm file(). Khi hàm này được gọi, mỗi dòng của file sẽ được lưu trữ trong một phần tử riêng biệt của mảng đã chỉ định.

Lưu ý: Không nên sử dụng hàm file() trên các tệp an toàn nhị phân vì Nó không an toàn khi đọc tệp nhị phân và nếu nó gặp ký tự cuối tệp (EOF) ở đâu đó, điều đó không đảm bảo rằng bạn sẽ đọc toàn bộ tệp nhị phân.

$file_array = file("counter.txt"); // Đọc file vào $file_array

// Làm việc với dữ liệu mảng

Lưu ý: Làm việc với mảng được mô tả chi tiết tại đây, tác giả: Mukhametshin D.F., Simdyanov I.V.

Ở cuối bài viết, bạn sẽ tìm thấy một “cuốn sách công thức” hay về mảng, cung cấp giải pháp cho nhiều vấn đề mà một lập trình viên web gặp phải hàng ngày.

Hãy tưởng tượng một tình huống trong đó một tập tin cần được đọc từng ký tự. Để làm điều này, chúng ta có thể sử dụng hàm fgetc(). Hàm này nhận một tham số duy nhất. Hàm này rất hữu ích nếu chúng ta cần tìm bất kỳ ký tự nào hoặc số lượng ký tự giống hệt nhau.

$fp = fopen("counter.txt", "r"); //Mở file ở chế độ đọc

Nếu ($fp)

Trong khi(!feof($fp))

$char = fgetc($fp);

Nếu ($char == "c")

$i = $i + 1;// Tìm ký hiệu “c”

Echo "Số ký tự 'c' trong tệp: ". $i;

Khác echo "Lỗi mở tập tin";

III. Đóng một tập tin

Tệp được đóng bằng hàm fclose(), hàm này nhận 1 tham số bắt buộc.

$fp = fopen("counter.txt", "r");

Nếu ($fp)

Echo "Mở tệp";

Fclose($fp); // Đóng tập tin

Bộ sưu tập công thức nấu ăn

1) Chúng ta cần kiểm tra xem tập tin này hay tập tin đó có tồn tại hay không. Để làm điều này, chúng ta sẽ sử dụng hàm file_exists().

myfile("counter.txt"); // Sử dụng hàm myfile, truyền tên file làm đối số

function myfile($name) //Tạo hàm kiểm tra sự tồn tại của file

Nếu (file_exists($name)) echo "Tệp tồn tại";

Lưu ý: Hàm file_exists không kiểm tra tệp trên máy chủ web từ xa. Để chức năng hoạt động chính xác, tệp có tập lệnh phải được đặt trên cùng một máy chủ với tệp đang được kiểm tra.

2) Xác định kích thước tệp bằng hàm filesize()

myfile("counter.txt");

//Tạo hàm kiểm tra sự tồn tại của file và xác định kích thước file

chức năng myfile($name)

If (file_exists($name)) echo "Kích thước tệp: ".filesize($name)." byte";

Ngược lại echo "Tập tin không tồn tại";

3) Tạo tệp tạm thời bằng hàm tmpfile()

$myfile = tmpfile();

// Ghi vào file tạm thời

Fwrite($myfile, "Dòng này được ghi vào một tập tin tạm thời.");

Fseek($myfile, 0); // Đặt con trỏ tập tin

Echo fread($myfile, 1024); //xuất nội dung của file

4) Bạn cần xác định số dòng trong tệp. Để làm điều này chúng ta sử dụng hàm count()

$fp = file("counter.txt");

Echo "Số dòng trong tập tin: ".count($fp);

5) Chúng ta cần sử dụng cơ chế khóa tập tin

$fp = fopen("counter.txt", "a");

Đàn($fp, LOCK_EX); // Khóa file để ghi

Fwrite($fp, "Chuỗi cần viết");

Đàn($fp, LOCK_UN); // Mở khóa

Fclose($fp);

6) Chúng ta cần xóa một dòng nhất định khỏi tệp

$num_stroka = 5; //Xóa dòng 5 khỏi file

$file = file("counter.txt"); // Đọc toàn bộ file vào một mảng

Với($i = 0; $i< sizeof($file); $i++)

If($i == $num_stroka) unset($file[$i]);

$fp = fopen("counter.txt", "w");

Fputs($fp, implode("", $file));

Fclose($fp);

7) Xác định loại tệp. Chúng ta sử dụng hàm filetype(), hàm này nhận một tham số duy nhất

$mytype = filetype("counter.txt");

Echo "Loại tệp: ".$mytype;

Sau cuộc gọi, chuỗi có thể chứa một trong các giá trị sau:

tập tin - tập tin thông thường

dir – thư mục

fifo – kênh fifo

khối – thiết bị hướng khối

char – thiết bị hướng ký tự

không xác định – loại tệp không xác định

8) Nếu bạn muốn xem tất cả các tham số của file, bạn nên sử dụng hàm stat()

$filename = stat("counter.txt");

Tiếng vang"

";

Print_r ($ tên tệp);

Tiếng vang"

";

9) Chúng ta cần xóa file, sử dụng hàm ftruncate()

$fp = fopen("counter.txt", "a"); //Mở file ở chế độ ghi

Ftruncate($fp, 0) // xóa tập tin

10) Chúng ta cần tìm ra ngày sửa đổi cuối cùng của tệp, chúng ta sử dụng hàm filectime(). Hàm trả về giá trị thời gian ở dạng dấu thời gian Unix.

Echo filectime("counter.txt");