Làm việc với các tập tin trong php: mở, viết, đọc. Tạo, đọc và ghi tập tin Php

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://, 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 cùng 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ở một kết nối đến 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, trả về TRUE; nếu đóng không thành công, 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($filename, "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()). Quá trình đọ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 từng dòng một tệp:

$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, một dạng nấm mới lạ được phát hiện đang 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 hổi - Khoa học Sinh vật ngoài hành tinh được phát hiện vào ngày 20 tháng 8 năm 2000 Sáng nay, một dạng nấm mới kỳ lạ được phát hiện đang mọc trong tủ quần áo của 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ác ổ 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ó một hàm nữa mà bạn cần làm quen: 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â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 dòng hệ thố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():

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; TRUE được trả về 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 công việc 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 bộ điều khiển 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 nó nằm trê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ị của $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 cùng với 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 xuất ra.

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

// Gọi đệ quy tới hàm 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 thể hiện kết quả chạy tập lệnh cho một thư mục có 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à bây giờ sẽ có một bài học khá lớn nhưng không phức tạp về cách làm việc với các tệp trong PHP. Trước hết, các tập tin dùng để làm gì? Rốt cuộc, bạn có thể lưu trữ mọi thứ trong MySQL hoặc PostgreSQL hoặc bất kỳ cơ sở dữ liệu nào khác. Nhưng đôi khi có những tác vụ khi sử dụng cơ sở dữ liệu, với tất cả quá trình xử lý và lo ngại về bảo mật kết nối, là không nên. Ví dụ: chúng ta cần tạo một bộ đếm thông thường, nhưng trước đó chúng ta không sử dụng cơ sở dữ liệu trong dự án. Vì vậy, vì một bộ đếm nhỏ, chúng ta có nên tạo một cơ sở dữ liệu và chỉ lưu trữ một vài dòng trong đó không? Việc sử dụng các tập tin ở đây dễ dàng hơn nhiều. Ngoài ra, đôi khi dịch vụ lưu trữ hoàn toàn không hỗ trợ cơ sở dữ liệu, khi đó các tệp thường là lựa chọn duy nhất.

Chà, giả sử tôi đã thuyết phục bạn rằng các tệp này là cần thiết :) Bây giờ hãy tìm cách làm việc với chúng. Cách tạo, mở, viết, ghi đè, đọc, v.v. Điều đầu tiên trước tiên.

Tạo một tập tin

PHP sử dụng hàm fopen để mở tệp. Tuy nhiên, nó cũng có thể tạo tập tin. Nếu bạn chuyển fopen một tên tệp không tồn tại, nó sẽ tạo ra nó.

Bản thân hàm fopen có hai tham số, cả hai đều bắt buộc. Đầu tiên chúng ta phải chỉ định tên file muốn mở. Thứ hai, truyền một tham số cho hàm biết chúng ta định làm gì với tệp này (ví dụ: đọc từ tệp, ghi, v.v.).

Nếu cần tạo một tệp thì chúng ta chỉ định tên của nó và truyền tham số mà chúng ta muốn ghi dữ liệu vào đó. Lưu ý: Chúng ta phải đảm bảo cho PHP biết chúng ta đang ghi gì vào tệp, nếu không nó sẽ không tạo tệp mới.
Ví dụ:

$ourFileName = "testFile.txt"; $ourFileHandle = fopen($ourFileName, "w") hoặc die("không thể mở tệp"); fclose($ourFileHandle);

Dòng đầu tiên $ourFileName = testFile.txt tạo một trong đó chúng ta sẽ lưu trữ tên tệp.
Dòng thứ hai $ourFileHandle = fopen($ourFileName, 'w') hoặc die(“không thể mở tệp”) tương ứng tạo hoặc mở một tệp hiện có để ghi. Hoặc nó trả về thông báo không mở được file.
Dòng thứ ba fclose($ourFileHandle) đóng tệp. Nó thực sự đơn giản.

Tùy chọn mở tệp trong php

  • Tham số đầu tiên 'r' (đọc) - mở tệp ở chế độ chỉ đọc; bạn không thể ghi vào nó.
  • Tham số thứ hai 'w' (ghi) - mở để ghi. Trong trường hợp này, bản ghi sẽ luôn bắt đầu từ đầu tệp. Nếu đã có một số thông tin ở đó, nó sẽ bị ghi đè.
  • Tham số thứ ba 'a' (nối thêm) - mở tệp để ghi, nhưng sẽ nối thêm vào cuối tệp, không giống như w.

Tùy chọn nâng cao:

  • Tham số 'r+' - mở cho cả đọc và ghi. Con trỏ sẽ ở đầu tập tin.
  • Tham số 'w+' - mở cho cả đọc và ghi, NHƯNG xóa tất cả thông tin có trong tệp!!!
  • tham số 'a+' - mở để đọc và ghi, nhưng con trỏ sẽ ở cuối tệp.

Đương nhiên, chỉ một trong những tham số này có thể được truyền cho hàm chứ không phải một số tham số. Chúng cần được thay thế thay vì 'X':

Fopen($ourFileName, "X")

Viết vào tập tin

Chà, bây giờ chúng ta đã mở file, chọn tham số mình cần, tiếp theo là gì? Bạn cần phải viết một cái gì đó trong đó. Làm thế nào để làm nó? Sử dụng hàm fwrite, hàm này lấy tham số là một con trỏ tới một tệp và một dòng văn bản mà chúng ta muốn viết. Ví dụ:

$myFile = "testFile.txt"; $fh = fopen($myFile, "w") hoặc die("không thể mở tập tin"); $stringData = "Dòng đầu tiên\n"; fwrite($fh, $stringData); $stringData = "Dòng thứ hai\ n n"; fwrite($fh, $stringData); fclose($fh);

Chúng tôi đã tạo một tệp testFile.txt, con trỏ tới nó được lưu trữ trong biến $fn. Chúng tôi đã viết dòng “Dòng đầu tiên” vào đó (áp dụng ký hiệu cuối dòng \n ở cuối), rồi đến “Dòng thứ hai”. Sau đó họ đóng tập tin.

CHÚ Ý!Đừng bao giờ quên đóng tập tin của bạn! Ngược lại, nếu quá trình thực thi tập lệnh kết thúc bất thường, dữ liệu trong tệp sẽ không được lưu! Luôn sử dụng fclose sau giờ làm việc!!!

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

Chúng tôi đã viết nó ra, bây giờ hãy đọc nó! Nó cũng không khó lắm đâu. Chúng tôi sử dụng chức năng fread. Khi làm đầu vào, chúng tôi cung cấp cho nó một con trỏ tới tệp và số byte chúng tôi muốn đọc. Ví dụ: một ký tự bằng một byte (tùy thuộc vào bảng mã), chúng tôi muốn đọc 5 ký tự: $theData = fread($fh, 5).
Nhưng nếu chúng ta cần lấy tất cả thông tin có trong tệp, thì chúng ta cần hàm filesize, hàm này trả về số byte trong tệp, do đó, nếu kết quả của hàm filesize được chuyển đến fread, thì chúng ta sẽ nhận được tất cả thông tin từ tập tin:

$myFile = "testFile.txt"; $fh = fopen($myFile, "r"); $theData = fread($fh, filesize($myFile)); fclose($fh); echo $theData;

Tôi hy vọng tôi đã giải thích nó rõ ràng.
Đôi khi việc đọc tệp theo từng dòng chứ không phải theo số byte sẽ rất hữu ích. Để làm điều này, thay vì fread bạn chỉ cần sử dụng fgets:

$myFile = "testFile.txt"; $fh = fopen($myFile, "r"); $theData = fgets($fh); fclose($fh); echo $theData;

Kết quả chúng ta nhận được dòng đầu tiên từ file testFile.txt. Theo đó, để đi qua tất cả các dòng bạn cần sử dụng:

\n"; ?>

Bây giờ bạn đã học cách mở tệp để đọc, viết hoặc cả hai. Viết dữ liệu cho chúng hoặc nối chúng lên trên bằng cách sử dụng Nối thêm, đồng thời đọc thông tin từ chúng.

Và bây giờ sẽ có một bài học khá lớn nhưng không phức tạp về cách làm việc với các tệp trong PHP. Trước hết, các tập tin dùng để làm gì? Rốt cuộc, bạn có thể lưu trữ mọi thứ trong MySQL hoặc PostgreSQL hoặc bất kỳ cơ sở dữ liệu nào khác. Nhưng đôi khi có những tác vụ khi sử dụng cơ sở dữ liệu, với tất cả quá trình xử lý và lo ngại về bảo mật kết nối, là không nên. Ví dụ: chúng ta cần tạo một bộ đếm thông thường, nhưng trước đó chúng ta không sử dụng cơ sở dữ liệu trong dự án. Vì vậy, vì một bộ đếm nhỏ, chúng ta có nên tạo một cơ sở dữ liệu và chỉ lưu trữ một vài dòng trong đó không? Việc sử dụng các tập tin ở đây dễ dàng hơn nhiều. Ngoài ra, đôi khi dịch vụ lưu trữ hoàn toàn không hỗ trợ cơ sở dữ liệu, khi đó các tệp thường là lựa chọn duy nhất.

Chà, giả sử tôi đã thuyết phục bạn rằng các tệp này là cần thiết :) Bây giờ hãy tìm cách làm việc với chúng. Cách tạo, mở, viết, ghi đè, đọc, v.v. Điều đầu tiên trước tiên.

Tạo một tập tin

PHP sử dụng hàm fopen để mở tệp. Tuy nhiên, nó cũng có thể tạo tập tin. Nếu bạn chuyển fopen một tên tệp không tồn tại, nó sẽ tạo ra nó.

Bản thân hàm fopen có hai tham số, cả hai đều bắt buộc. Đầu tiên chúng ta phải chỉ định tên file muốn mở. Thứ hai, truyền một tham số cho hàm biết chúng ta định làm gì với tệp này (ví dụ: đọc từ tệp, ghi, v.v.).

Nếu cần tạo một tệp thì chúng ta chỉ định tên của nó và truyền tham số mà chúng ta muốn ghi dữ liệu vào đó. Lưu ý: Chúng ta phải đảm bảo cho PHP biết chúng ta đang ghi gì vào tệp, nếu không nó sẽ không tạo tệp mới.

Ví dụ:

$ourFileName = "testFile.txt";

$ourFileHandle = fopen($ourFileName, "w") hoặc die("không thể mở tệp");

fclose($ourFileHandle);

Dòng đầu tiên $ourFileName = testFile.txt tạo một biến chuỗi trong đó chúng ta sẽ lưu tên tệp.

Dòng thứ hai $ourFileHandle = fopen($ourFileName, 'w') hoặc die(“không thể mở tệp”) tương ứng tạo hoặc mở một tệp hiện có để ghi. Hoặc nó trả về thông báo không mở được file.

Dòng thứ ba fclose($ourFileHandle) đóng tệp. Nó thực sự đơn giản.

Tùy chọn mở tệp trong php

Tham số đầu tiên 'r' (đọc) - mở tệp ở chế độ chỉ đọc; bạn không thể ghi vào nó.

Tham số thứ hai 'w' (ghi) - mở để ghi. Trong trường hợp này, bản ghi sẽ luôn bắt đầu từ đầu tệp. Nếu đã có một số thông tin ở đó, nó sẽ bị ghi đè.

Tham số thứ ba 'a' (nối thêm) - mở tệp để ghi, nhưng sẽ nối thêm vào cuối tệp, không giống như w.

Tùy chọn nâng cao:

Tham số 'r+' - mở cho cả đọc và ghi. Con trỏ sẽ ở đầu tập tin.

Tham số 'w+' - mở cho cả đọc và ghi, NHƯNG xóa tất cả thông tin có trong tệp!!!

tham số 'a+' - mở để đọc và ghi, nhưng con trỏ sẽ ở cuối tệp.

Đương nhiên, chỉ một trong những tham số này có thể được truyền cho hàm chứ không phải một số tham số. Chúng cần được thay thế cho 'X":

fopen($ourFileName, "X")

Viết vào tập tin

Chà, bây giờ chúng ta đã mở file, chọn tham số mình cần, tiếp theo là gì? Bạn cần phải viết một cái gì đó trong đó. Làm thế nào để làm nó? Sử dụng hàm fwrite, hàm này lấy tham số là một con trỏ tới một tệp và một dòng văn bản mà chúng ta muốn viết. Ví dụ:

$myFile = "testFile.txt";

$fh = fopen($myFile, "w") hoặc die("không thể mở tệp");

$stringData = "Dòng đầu tiên";

fwrite($fh, $stringData);

$stringData = "Dòng thứ hai";

fwrite($fh, $stringData);

Chúng tôi đã tạo một tệp testFile.txt, con trỏ tới nó được lưu trữ trong biến $fn. Chúng tôi viết dòng “Dòng đầu tiên” vào đó (cuối cùng chúng tôi sử dụng ký hiệu cuối dòng n), và sau đó là “Dòng thứ hai”. Sau đó họ đóng tập tin.

CHÚ Ý! Đừng bao giờ quên đóng tập tin của bạn! Ngược lại, nếu quá trình thực thi tập lệnh kết thúc bất thường, dữ liệu trong tệp sẽ không được lưu! Luôn sử dụng fclose sau giờ làm việc!!!

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

Chúng tôi đã viết nó ra, bây giờ hãy đọc nó! Nó cũng không khó lắm đâu. Chúng tôi sử dụng chức năng fread. Khi làm đầu vào, chúng tôi cung cấp cho nó một con trỏ tới tệp và số byte chúng tôi muốn đọc. Ví dụ: một ký tự bằng một byte (tùy thuộc vào bảng mã), chúng tôi muốn đọc 5 ký tự: $theData = fread($fh, 5).

Nhưng nếu chúng ta cần lấy tất cả thông tin có trong tệp thì chúng ta cần hàm filesize, hàm này trả về số byte trong tệp, do đó, nếu kết quả của hàm filesize được chuyển đến fread, thì chúng ta sẽ nhận được tất cả thông tin từ tập tin:

$myFile = "testFile.txt";

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

$theData = fread($fh, filesize($myFile));

Tôi hy vọng tôi đã giải thích nó rõ ràng.

$myFile = "testFile.txt";

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

$theData = fgets($fh);

Kết quả chúng ta nhận được dòng đầu tiên từ file testFile.txt. Theo đó, để đi qua tất cả các dòng bạn cần sử dụng vòng lặp foreach:

$lines = file("testFile.txt");

foreach($lines as $single_line)

tiếng vang $single_line . "
N";

Bây giờ bạn đã học cách mở tệp để đọc, viết hoặc cả hai. Viết dữ liệu cho chúng hoặc nối chúng lên trên bằng cách sử dụng Nối thêm, đồng thời đọc thông tin từ chúng.

Trong PHP, bạn thường phải xử lý việc tạo một tệp... 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 2 chế độ r và r+ này thì file phải được tạo sẵn rồi (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.