Trong bài học này, bạn sẽ tìm hiểu cách tạo, truy cập (hoặc đọc) và thao tác các tệp một cách linh hoạt bằng các hàm hệ thống tệp (file system
functions) của PHP.
Làm việc với File trong PHP
Vì PHP là ngôn ngữ lập trình phía máy chủ (server side programming language), nó cho phép bạn làm việc với các tệp và thư mục được lưu trữ trên web server.
Trong hướng dẫn này, bạn sẽ tìm hiểu cách tạo, truy cập và thao tác các tệp trên máy chủ web của mình bằng các hàm mà PHP cung cấp sẵn.
1. Mở file với hàm fopen() trong PHP
Để làm việc với một tệp tin, trước tiên bạn cần mở tệp tin ra đã chứ nhỉ?
Hàm fopen() của PHP được sử dụng để mở tệp. Cú pháp của hàm này được sử dụng như sau:
fopen(filename, mode)
Tham số đầu tiên được truyền cho fopen() chỉ định tên của tệp bạn muốn mở và tham số thứ hai chỉ định chế độ nào tệp sẽ được mở. Ví dụ:
<?php
$handle = fopen("data.txt", "r");
?>
Các chế độ mở tệp tin trong PHP
- r: Mở tệp để chỉ đọc.
- r+: Mở tệp để đọc và viết.
- w: Mở tệp chỉ để viết và xóa nội dung của tệp. Nếu tệp không tồn tại, PHP sẽ cố gắng tạo nó.
- w+: Mở tệp để đọc và viết và xóa nội dung của tệp. Nếu tệp không tồn tại, PHP sẽ cố gắng tạo nó.
- a: Nối. Mở tệp chỉ để viết. Giữ nguyên nội dung tệp bằng cách viết vào cuối tệp. Nếu tệp không tồn tại, PHP sẽ cố gắng tạo nó.
- a+: Đọc / Nối. Mở tệp để đọc và viết. Giữ nguyên nội dung tệp bằng cách viết đến cuối tệp. Nếu tệp không tồn tại, PHP sẽ cố gắng tạo nó.
- x: Mở tệp chỉ để viết. Trả về FALSE và tạo ra lỗi nếu tệp đã tồn tại. Nếu tệp không tồn tại, PHP sẽ cố gắng tạo nó.
- x+: Mở tệp để đọc và viết. Trả về FALSE và tạo ra lỗi nếu tệp đã tồn tại. Nếu tệp không tồn tại, PHP sẽ cố gắng tạo nó.
Nếu bạn cố mở một tệp không tồn tại, PHP sẽ tạo một thông báo cảnh báo.
Vì vậy, để tránh các thông báo lỗi này, bạn phải luôn thực hiện kiểm tra đơn giản xem một tệp hoặc thư mục có tồn tại hay không trước khi thử truy cập nó, với hàm file_exists() trong PHP
Thực hiện như sau:
<?php
$file = "data.txt";
// Kiểm tra xem 1 tệp có tồn tại hay không
if(file_exists($file)){
// Thử mở file
$handle = fopen($file, "r");
} else{
echo "ERROR: File không tồn tại.";
}
?>
Lưu ý: Làm việc với các tập tin và thư mục rất dễ bị lỗi.
Vì vậy, đó là một cách tốt nhất để thực hiện một số giải pháp nếu xảy ra lỗi, chương trình của bạn sẽ xử lý lỗi. Xem bài hướng dẫn xử lý lỗi trong PHP (PHP error handling).
2. Đóng tệp với hàm fclose() trong PHP
Khi bạn đã hoàn thành công việc với một tệp, nó cần phải được đóng lại. Hàm fclose() sẽ giúp bạn làm công việc này, như trong ví dụ sau:
<?php
$file = "data.txt";
// Kiểm tra xem 1 file có tồn tại hay không
if(file_exists($file)){
// Mở file để đọc
$handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
/* Code thực thi hành động nào đó */
// Đóng file lại
fclose($handle);
} else{
echo "ERROR: File does not exist.";
}
?>
Lưu ý: Mặc dù PHP tự động đóng tất cả các tệp đang mở khi tập lệnh kết thúc, nhưng đấy chỉ là sau khi thực hiện tất cả các hành động.
3. Đọc các tệp với hàm fread() trong PHP
Bây giờ bạn đã hiểu làm thế nào để mở và đóng một tệp bất kỳ nào đó.
Trong phần này, bạn sẽ học cách đọc dữ liệu từ một tệp. PHP có một số hàm để đọc dữ liệu từ một tệp.
Bạn có thể đọc từ chỉ một ký tự cho toàn bộ tệp chỉ bằng một thao tác:
Đọc cố định số lượng ký tự trong file bằng hàm fread()
fread(file handle, length in bytes)
Hàm này có hai tham số:
- Một tệp xử lý
- Số byte để đọc.
Ví dụ sau đọc 20 byte từ tệp ‘data.txt’ bao gồm cả khoảng trắng. Giả sử tập tin ‘data.txt’ chứa một đoạn văn bản:
“The quick brown fox jumps over the lazy dog.”
Chương trình cần viết sẽ là:
<?php
$file = "data.txt";
// Kiểm tra file có tồn tại hay không
if(file_exists($file)){
// Mở một file ra để đọc
$handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
// Đọc 20 byte trong File này
$content = fread($handle, "20");
// Đóng file lại
fclose($handle);
// Hiển thị nội dung tệp tin
echo $content;
} else{
echo "ERROR: File does not exist.";
}
?>
Kết quả chúng ta nhận được sẽ là:
The quick brown fox
Đọc toàn bộ nội dung của File
Hàm fread() có thể được sử dụng kết hợp với hàm filesize() để đọc toàn bộ tệp cùng một lúc.
Chúng ta sẽ làm thế này:
- Trước tiên, ta sử dụng hàm filesize() trả về kích thước của tệp theo byte.
- Sau đó, sử dùng hàm fread() để đọc file với số byte mà hàm filesize() vừa trả về
<?php
$file = "data.txt";
// Kiểm tra xem file có tồn tại hay không
if(file_exists($file)){
// Mở file để đọc
$handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
// Đọc toàn bộ file
$content = fread($handle, filesize($file));
// Đóng file lại
fclose($handle);
// Hiển thị nội dung
echo $content;
} else{
echo "ERROR: File does not exist.";
}
?>
Ví dụ trên sẽ tạo ra kết quả:
The quick brown fox jumps over the lazy dog.
Cách dễ nhất để đọc toàn bộ nội dung của tệp trong PHP là với hàm readfile().
Hàm này này cho phép bạn đọc nội dung của tệp mà không cần mở tệp. Ví dụ sau sẽ tạo ra cùng một kết quả như ví dụ trên:
<?php
$file = "data.txt";
// Kiểm tra xem file có tồn tại hay không
if(file_exists($file)){
// Đọc và xuất toàn bộ file
readfile($file) or die("ERROR: Cannot open the file.");
} else{
echo "ERROR: File does not exist.";
}
?>
Ví dụ trên sẽ tạo ra kết quả:
The quick brown fox jumps over the lazy dog.
Một cách khác để đọc toàn bộ nội dung của tệp mà không cần mở tệp đó là với hàm file_get_contents().
Hàm này chấp nhận tên và đường dẫn đến một tệp và đọc toàn bộ tệp thành một biến chuỗi. Đây là một ví dụ:
<?php
$file = "data.txt";
// Kiểm tra xem file có tồn tại không
if(file_exists($file)){
// Đọc toàn bộ tệp tin và biến thành chuỗi
$content = file_get_contents($file) or die("ERROR: Cannot open the file.");
// Hiển thị nội dung file
echo $content;
} else{
echo "ERROR: File does not exist.";
}
?>
Đây là một phương pháp nữa để đọc toàn bộ dữ liệu từ một tệp là hàm tệp () của PHP.
Nó thực hiện một công việc tương tự như hàm file_get_contents(), nhưng nó trả về nội dung tệp dưới dạng một mảng các dòng, thay vì một chuỗi.
Mỗi phần tử của mảng trả về tương ứng với một dòng trong tệp.
Một cách khác là sử dụng hàm file_put_contents().
Nó là đối tác của hàm file_get_contents () và cung cấp một phương pháp dễ dàng ghi dữ liệu vào một tệp mà không cần phải mở nó.
Hàm này chấp nhận tên và đường dẫn đến một tệp cùng với dữ liệu được ghi vào tệp. Đây là một ví dụ:
<?php
$file = "note.txt";
// Tạo ra một chuỗi để thử nghiệm
$data = "The quick brown fox jumps over the lazy dog.";
// Ghi dữ liệu vào file
file_put_contents($file, $data) or die("ERROR: Cannot write the file.");
echo "Data written to the file successfully.";
?>
Nếu tệp được chỉ định trong hàm file_put_contents() đã tồn tại, PHP sẽ ghi đè lên nó theo mặc định.
Nếu bạn muốn giữ lại nội dung của tệp, bạn có thể gắn nhãn FILE_APPEND làm tham số thứ ba cho hàm file_put_contents().
Nó chỉ đơn giản là nối thêm dữ liệu mới vào tệp thay vì ghi đè lên nó. Đây là một ví dụ:
<?php
$file = "note.txt";
// Tạo ra một chuỗi để thử nghiệm
$data = "The quick brown fox jumps over the lazy dog.";
// Ghi dữ liệu vào file
file_put_contents($file, $data, FILE_APPEND) or die("ERROR: Cannot write the file.");
echo "Data written to the file successfully.";
?>
Đổi tên tệp với hàm rename() trong PHP
Bạn có thể đổi tên một tệp hoặc thư mục bằng cách sử dụng hàm rename() của PHP, như thế này:
<?php
$file = "file.txt";
// Kiểm tra xem file có tồn tại hay không
if(file_exists($file)){
// Đổi tên của file
if(rename($file, "newfile.txt")){
echo "File renamed successfully.";
} else{
echo "ERROR: File cannot be renamed.";
}
} else{
echo "ERROR: File does not exist.";
}
?>
Xóa các tệp với hàm unlink() trong PHP
Bạn có thể xóa các tệp hoặc thư mục bằng hàm unlink() của PHP, như thế này:
<?php
$file = "note.txt";
// Kiểm tra file có tồn tại hay không
if(file_exists($file)){
// Xóa file
if(unlink($file)){
echo "File removed successfully.";
} else{
echo "ERROR: File cannot be removed.";
}
} else{
echo "ERROR: File does not exist.";
}
?>
Các hàm thao tác với file trong PHP khác
Bên dưới đây mình sẽ cung cấp thêm về một số hàm thao tác với tệp trong PHP hữu ích khác có thể được sử dụng để đọc và ghi các tệp động.
- fgetc(): Đọc một ký tự tại một thời điểm.
- fgets(): Đọc một dòng tại một thời điểm
- fgetcsv(): Đọc một dòng các giá trị được cách nhau bằng dấu phẩy
- filetype(): Trả về kiểu của file đó
- feof(): Kiểm tra xem tệp tin đã kết thúc hay chưa
- is_file(): Kiểm tra xem đây có phải là 1 file bình thường
- is_dir(): Kiểm tra xem đây có phải là một thư mục
- is_executable(); Kiểm tra xem đây có phải file thực thi
- realpath(): Trả về tên dường dẫn tuyệt đối
- rmdir(): Xóa một thư mục trống
Tổng kết
Như vậy là qua bài học này bạn đã được tìm hiểu về cách mở tệp, đóng tệp, đọc tệp, ghi tệp, xóa bỏ tệp…
Thao tác với tệp là hành động rất quan trọng khi lập trình web. Vì thế, hãy luyện tập thêm để thật sự thuần thục cách thao tác với tệp bằng các hàm PHP cung cấp sẵn bạn nhé.