Xử lý file(tập tin) là một phần rất quan trọng của bất kỳ ứng dụng web nào. Bạn thường cần mở và xử lý một file cho những công việc khác nhau. Và PHP cung cấp cho ta một số hàm để tạo, đọc, tải và chỉnh sửa file. Tuy nhiên hãy cẩn thận khi thao tác với các tập tin! Vì bạn không thể biết rằng mình có thể làm sai điều gì đó dẫn đến thiệt hại cho file. Các lỗi thường gặp như chỉnh sai tệp, làm đầy ổ cứng bằng tệp rác và nặng hơn là vô tình xóa mất nội dung trong file. Vì vậy mà hãy cẩn thận khi thao tác với file!

1. Hàm readfile () trong PHP

Hàm readfile() có tác dụng mở một file và đọc nội dung của file đó. Một hàm tương tự khác cũng có tác dụng đọc nội dung file là file_get_contents(). Hàm readfile() sẽ đọc kết file được truyền vào và in kết quả đọc được ra màn hình.

Cú pháp:

readfile ( string $filename [, bool $use_include_path = FALSE [, resource $context ]] ) : int

Trong đó:

  • $filename: là đường dẫn tới file cần đọc.
  • $set_include_path: là tham số quy định việc tìm kiếm file trong include_path.
  • $context: thường được bỏ qua nếu bạn không sử dụng ngữ cảnh đặc biệt.

Giá trị trả về là số byte được đọc từ tệp khi thành công hoặc không thành công là False.

Ví dụ: ta có một file read.txt có dạng như sau:

AJAX = JavaScript và XML không đồng bộ

CSS = Trang tính kiểu xếp tầng

HTML = Ngôn ngữ đánh dấu siêu văn bản

PHP = Bộ tiền xử lý siêu văn bản PHP

SQL = Ngôn ngữ truy vấn có cấu trúc

SVG = Đồ họa Vectơ có thể mở rộng

XML = Ngôn ngữ đánh dấu có thể mở rộng

Và ta có:

<?php
echo readfile("read.txt");
?>

Lưu ý

  • Ghi chú: readfile () sẽ không xuất hiện bất kỳ vấn đề bộ nhớ nào, ngay cả khi gửi các tệp lớn, của chính nó. Nếu bạn gặp phải lỗi hết bộ nhớ, hãy đảm bảo rằng bộ đệm đầu ra được tắt với ob_get_level ().
  • Một URL có thể được sử dụng làm tên tệp với chức năng này nếu fopen wrappers đã được bật. Xem fopen() để biết thêm chi tiết về cách chỉ định tên tệp. Xem Giao thức được Supported Protocols and Wrappers đến thông tin về những khả năng mà các trình bao bọc khác nhau có, ghi chú về việc sử dụng chúng và thông tin về bất kỳ biến xác định trước nào mà chúng có thể cung cấp.

2. Mở file với PHP

Để mở một file ta dùng hàm fopen($path, $mode).

Trong đó:

  • path: đường dẫn file.
  • mode: chế độ mở file (mở để ghi, xem, sửa, tạo file mới …).

Ví dụ:

<?php
$handle = fopen("D:\\folder\\file.txt", "r");
?>

Thuộc tính bao gồm các quyền hạn cho phép thao tác trên file:

  • r: Read Only. Mở file chỉ để đọc. Con trỏ bắt đầu từ đầu file
  • r+: Read – Write. Mở file để đọc/ghi. Con trỏ nằm ở cuối file
  • w: Write Only, Mở ra chỉ để ghi. Xóa toàn bộ nội dung trong file hoặc tạo file mới nếu file chưa tồn tại. Con trỏ bắt đầu từ đầu file. Nếu file không tồn tại sẽ tạo một file mới
  • w+: Write – Read, Mở file để đọc/ghi. Xóa toàn bộ nội dung trong file hoặc tạo file mới nếu file chưa tồn tại. Con trỏ bắt đầu từ đầu file. Nếu file không tồn tại sẽ tạo một file mới.
  • a: append – chỉ ghi. Mở ra chỉ để ghi. Giữ lại nội dung file nếu có. Con trỏ bắt đầu ở cuối file. Tạo mới file nếu file chưa tồn tại. Nếu file tồn tại sẽ ghi tiếp vào phần dưới của nội dung.
  • a+: append – đọc và ghi. Nếu file tồn tại sẽ ghi tiếp vào phần dưới của nội dung, nếu file không tồn tại sẽ tạo file mới.
  • b: Mở file dưới dạng file binary ( nhị phân ).
  • x: Tạo file mới để ghi. Trả về False hoặc lỗi nếu file đã tồn tại.
  • x+: Tạo ra file mới để đọc/ghi. Trả về FALSE hoặc lỗi nếu file đã tồn tại.

Ví dụ:

// Sử dụng dấu @ đằng trước hàm fopen để chặn
// thông báo lỗi khi sai đường dẫn
// Đường dẫn $path có thể là đường dẫn tương đối
// hoặc tuyệt đối đều được
$path = 'example.txt';
$fp = @fopen($path, "r");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
}
else{
    echo 'Mở file thành công';
}

3. Đọc file với PHP

Trong PHP có 3 cách đọc file thông dụng đó là đọc từng dòng, đọc từng ký tự và đọc hết file.

3.1. Đọc file từng ký tự

Trong PHP chúng ta sử dụng hàm feof() để kiểm tra xem đã ở vị trí cuối cùng của file chưa và hàm fgec() để đọc từng ký tự của file.

Ví dụ:

$fp = @fopen('read.txt', "r");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
} else {
    // Lặp qua từng ký tự để đọc
    while(!feof($fp))
    {
        echo fgetc($fp);
    }
}

3.2. Đọc file từng dòng

Ta sẽ dùng fgets($fp) để đọc theo từng dòng.

Ví dụ:

$fp = @fopen('read.txt', "r");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
} else {
    // Lặp qua từng dòng để đọc
    while(!feof($fp))
    {
        echo fgets($fp);
    }
}

Đối với đọc từng dòng và đọc từng ký tự ta phải dùng hàm feof($fp) đặt trong vòng lặp while để sau khi đọc xong nó sẽ chuyển sang dòng mới hoặc ký tự mới.

3.3. Đọc hết file

Để đọc hết tất cả file ta dùng hàm fread($fp, $size).

Trong đó:

  • $fp là đối tượng lúc mở file
  • $size là kích cỡ của file cần đọc. Để lấy kích cỡ của file cần đọc ta dùng hàm filesize($path).

Hàm PHP fread() được sử dụng để đọc nội dung của một file. Nó chấp nhận 2 tham số: resource và kích thước file. Fread( $filename, $filesize);

Trong đó:

• file – file cần đọc.

• filesize – Số byte tối đa cần đọc.

Ví dụ:

Đoạn code sau cho đọc file read.txt đến cuối:

fread($myfile,filesize("read.txt"));

4. Đóng file với PHP

Hàm PHP fclose($file); được sử dụng để đóng một file.

Ví dụ:

$file = @fopen('read.txt', 'w');
if (!$file) {
    echo "Mở file không thành công";
} else {
    $data = 'Đây là dữ liệu được ghi vào file.';
    fwrite($file, $data);
    fclose($file);
}

5. Ghi file với PHP

Để ghi dữ liệu vào file, chúng ta sẽ dùng hàm fwrite( $file, $content ).

Trong đó:

  • $file là đối tượng trả về lúc mở file.
  • $content là nội dung muốn ghi vào.

Việc ghi file phụ thuộc vào lúc mở file như thế nào. Ví dụ lúc mở file ghi đè thì lúc ghi file nó sẽ ghi đè, lúc mở file ghi kiểu append thì lúc ghi file nó sẽ thêm xuống cuối file, nếu mở file chỉ cho đọc thì bạn không thể ghi file được.

Ví dụ:

<?php
$fp = fopen('PHP.txt', "w"); 
if (!$fp) {
    echo "Can't open file";
}
else
{
    $data = 'Hello STDIO!';
    fwrite($fp, $data);
}
?>