Xử lý File - PHP

Trong chương này sẽ hướng dẫn các bạn cách tạo, truy cập (hoặc đọc) và thao tác động các tập tin (file) bằng cách sử dụng các hàm hệ thống tệp của PHP.

Làm việc với các File trong PHP

PHP là ngôn ngữ lập trình phía máy chủ nên nó cho phép chúng ta làm việc với các tập tin - file và thư mục được lưu trữ trên máy chủ web. Trong bài hướng dẫn này, bạn sẽ học cách tạo, truy cập và thao tác các tập tin trên máy chủ web của mình bằng cách sử dụng các chức năng của hệ thống.

Mở tập tin với hàm fopen()

Để làm việc với một tập tin - file, trước tiên bạn cần mở tập tin. Hàm fopen() được sử dụng để mở một tập tin.

Cú pháp của hàm này như sau:

fopen(filename, mode)

Tham số đầu tiên được truyền vào hàm fopen() là tên của tập tin bạn muốn mở và tham số thứ hai chỉ định tập tin sẽ được mở ở chế độ nào.

Ví dụ

<?php
$handle = fopen("data.txt", "r");
?>

Tập tin có thể được mở ở một trong các chế độ sau:

  • r : Mở tập tin chỉ để đọc.
  • r+ : Mở tập tin để đọc và ghi.
  • w :  Chỉ mở tập tin để ghi và xóa nội dung của tập tin. Nếu tập tin không tồn tại, PHP sẽ cố gắng tạo nó.
  • w+ Mở tập tin để đọc và ghi và xóa nội dung của tập tin. Nếu tập tin không tồn tại, PHP sẽ cố gắng tạo nó.
  • a :  Ghi. Chỉ mở tập tin để ghi. Bảo quản nội dung tập tin bằng cách ghi vào cuối tập tin. Nếu tập tin không tồn tại, PHP sẽ cố gắng tạo nó.
  • a+ Đọc / Ghi. Mở tập tin để đọc và ghi. Bảo quản nội dung tập tin bằng cách ghi vào cuối tập tin. Nếu tập tin không tồn tại, PHP sẽ cố gắng tạo nó.
  • x :  Chỉ mở tập tin để ghi. Trả lại giá trị FALSE và tạo ra lỗi nếu tập tin đã tồn tại. Nếu tập tin không tồn tại, PHP sẽ cố gắng tạo nó.
  • x+ : Mở tập tin để đọc và ghi, nếu không thì nó có cùng hành động với 'x'.

Nếu bạn cố gắng mở một tập tin không tồn tại, PHP sẽ tạo ra một thông báo cảnh báo. Vì vậy, để tránh những thông báo lỗi này, bạn nên luôn thực hiện kiểm tra đơn giản xem một tập tin hoặc thư mục có tồn tại hay không trước khi cố gắng truy cập nó, bằng hàm file_exists().

Ví dụ

<?php
$file = "data.txt";
// Kiểm tra xem tệp có tồn tại
if (file_exists($file)) {
    // Mở tệp tin
    $handle = fopen($file, "r");
} else {
    echo "Lỗi: Không tồn tại tập tin.";
}
?>

Mẹo: Các thao tác trên tập tin và thư mục dễ bị lỗi. Vì vậy, bạn nên thực hiện một số hình thức kiểm tra lỗi để nếu có lỗi xảy ra, tập lệnh của bạn sẽ xử lý lỗi một cách khéo léo. Xem phần hướng dẫn xử lý lỗi của PHP.

Đóng tập tin bằng hàm fclose()

Khi bạn đã làm việc xong với một tập tin, nó cần được đóng lại. Hàm fclose() được sử dụng để đóng tập tin.

Ví dụ

<?php
$file = "data.txt";
// Kiểm tra tồn tại
if (file_exists($file)) {
    // Mở tập tin để đọc
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    /* Một số mã được thực thi ở đây */
        
    // Đóng tập tin
    fclose($handle);
} else {
    echo "Lỗi: Tập tin không tồn tại.";
}
?>

Ghi chú: Mặc dù PHP tự động đóng tất cả các tập tin đang mở khi tập lệnh kết thúc, nhưng bạn nên đóng một tập tin sau khi thực hiện tất cả các thao tác.

Đọc dữ liệu từ tập tin với hàm fread()

Bây giờ bạn đã hiểu cách mở và đóng tập tin. Trong phần dưới đây, bạn sẽ học cách đọc dữ liệu từ một tập tin. PHP có một số chức năng để đọc dữ liệu từ một tập tin. Bạn có thể đọc chỉ từ một ký tự đến toàn bộ tập tin với một thao tác duy nhất.

Đọc số lượng ký tự cố định

Hàm fread() có thể được sử dụng để đọc một số quy định của ký tự từ một tập tin. Cú pháp cơ bản của hàm này là.

fread(file handle, length in bytes)

Hàm này nhận hai tham số - Một làm tập tin cần xử lý và số byte để đọc. Ví dụ sau đây đọc 20 byte từ tập tin "data.txt" bao gồm cả dấu cách. Giả sử tập tin "data.txt" chứa một đoạn văn bản "Cộng hòa xã hội chủ nghĩa Việt Nam"

Ví dụ

<?php
$file = "data.txt";
 
// Kiểm tra sự tồn tại của tệp
if (file_exists($file)) {
    // Mở và đọc tập tin
    $handle = fopen($file, "r") or die("Lỗi: Không thể đọc tệp.");
        
    // Đọc số byte cố định từ tệp
    $content = fread($handle, "20");
        
    // Đóng tập tin
    fclose($handle);
        
    // Hiển thị nội dung vừa đọc
    echo $content;
} else {
    echo "Lỗi: Tập tin không tồn tại.";
}
?>


Ví dụ trên sẽ tạo ra kết quả sau: Cộng hòa xã hộ

Đọc toàn bộ nội dung của một tập tin

Hàm  fread() có thể được sử dụng trong kết hợp với hàm filesize() để đọc toàn bộ tập tin cùng một lúc. Hàm filesize() trả về kích thước của các tập tin tính bằng byte.

Ví dụ

<?php
$file = "data.txt";
 
// Kiểm tra sự tồn tại của tệp
if (file_exists($file)) {
    // Mở và đọc tập tin
    $handle = fopen($file, "r") or die("Lỗi: Không thể đọc tập tin.");
        
    // Đọc nội dung tập tin
    $content = fread($handle, filesize($file));
        
    // Đóng tập tin
    fclose($handle);
        
    // Hiển thị nội dung vừa đọc
    echo $content;
} else {
    echo "Lỗi: tập tin không tồn tại.";
}
?>


Ví dụ trên sẽ tạo ra kết quả sau:

Cộng hòa xã hội chủ nghĩa Việt Nam

 

Cách dễ nhất để đọc toàn bộ nội dung của tập tin trong PHP là sử dụng hàm readfile(). Chức năng này cho phép bạn đọc nội dung của một tập tin mà không cần phải mở nó. 

Ví dụ

<?php
$file = "data.txt";
 
// Kiểm tra sự tồn tại của tập tin
if (file_exists($file)) {
    // Đọc và xuất ra kết quả
    readfile($file) or die("Lỗi: Không thể đọc tập tin.");
} else {
    echo "Lỗi: tập tin không tồn tại.";
}
?>


Ví dụ trên sẽ tạo ra kết quả sau:

Cộng hòa xã hội chủ nghĩa Việt Nam

 

Một cách khác để đọc toàn bộ nội dung của tập tin mà không cần mở tập tin đó là bằng hàm file_get_contents(). Hàm này chấp nhận tên và đường dẫn đến một tập tin, và đọc toàn bộ tập tin đó thành một biến chuỗi.

Ví dụ như sau:

<?php
$file = "data.txt";
 
// Kiểm tra sự tồn tại của tập tin
if(file_exists($file)){
    // Đọc toàn bộ tệp thành một chuỗi
    $content = file_get_contents($file) or die("Lỗi: Không thể mở tập tin.");
        
    // Hiển thị nội dung
    echo $content;
} else{
    echo "Lỗi: tập tin không tồn tại.";
}
?>


Một phương pháp khác để đọc toàn bộ dữ liệu từ một tập tin là hàm file() 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 tin dưới dạng một mảng các dòng, thay vì một chuỗi đơn lẻ. Mỗi phần tử của mảng được trả về tương ứng với một dòng trong tập tin.

Để xử lý dữ liệu tập tin, bạn cần phải lặp lại mảng bằng vòng lặp foreach . Đây là một ví dụ, đọc một tập tin vào một mảng và sau đó hiển thị nó bằng cách sử dụng vòng lặp:

Ví dụ

<?php
$file = "data.txt";
 
// Kiểm tra sự tồn tại
if (file_exists($file)) {
    // Đọc toàn bộ tệp thành một mảng
    $arr = file($file) or die("Lỗi: Không thể mở tập tin.");
    foreach ($arr as $line) {
        echo $line;
    }
} else {
    echo "Lỗi: tập tin không tồn tại.";
}
?>

Ghi tập tin bằng hàm fwrite()

Tương tự, bạn có thể ghi dữ liệu vào một tập tin hoặc nối vào tập tin hiện có bằng cách sử dụng hàm fwrite() . Cú pháp cơ bản của hàm này như sau:

fwrite(file handle, string)

Hàm fwrite() phải có hai tham số - Một tập tin tin để xử lý và chuỗi dữ liệu cần được thêm vào, như thể hiện trong ví dụ dưới:

Ví dụ

<?php
$file = "note.txt";
    
// Chuỗi dữ liệu cần ghi
$data = "Cộng hòa xã hội chủ nghĩa Việt Nam : Độc lập - Tự do - Hạnh phúc.";
    
// Mở tập tin để ghi dữ liệu
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
    
// Ghi dữ liệu vào tập tin
fwrite($handle, $data) or die ("Lỗi: Không thể ghi vào tập tin.");
    
// Đóng tập tin
fclose($handle);
    
echo "Dữ liệu được ghi vào tập tin thành công.";
?>


Trong ví dụ trên, nếu tập tin "note.txt" không tồn tại, PHP sẽ tự động tạo và ghi dữ liệu. Tuy nhiên, nếu tập tin "note.txt" đã tồn tại, PHP sẽ xóa nội dung của tập tin này trước khi ghi dữ liệu mới. Tuy nhiên, nếu bạn chỉ muốn nối tập tin và giữ nguyên nội dung hiện có, chỉ cần sử dụng chế độ a thay vì w trong ví dụ trên.

Một cách khác là sử dụng hàm file_put_contents(). Nó cũng giống 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 tin mà không cần phải mở nó. Hàm này chấp nhận tên và đường dẫn đến tập tin cùng với dữ liệu được ghi vào tập tin.

Ví dụ

<?php
$file = "note.txt";
    
// Chuỗi dữ liệu cần ghi
$data = "Cộng hòa xã hội chủ nghĩa Việt Nam : Độc lập - Tự do - Hạnh phúc.";
    
// Ghi dữ liệu vào tập tin
file_put_contents($file, $data) or die("Lỗi: Không thể ghi vào tập tin.");
    
echo "Dữ liệu được ghi vào tập tin thành công.";
?>


Nếu tập tin được chỉ định trong hàm file_put_contents() đã tồn tại, PHP sẽ ghi đè tập tin đó theo mặc định. Nếu bạn muốn giữ lại nội dung của tập tin, bạn có thể thêm FILE_APPEND làm tham số thứ ba cho hàm file_put_contents(). Nó sẽ chỉ thêm dữ liệu mới vào tập tin thay vì ghi đè lên nó.

Ví dụ

<?php
$file = "note.txt";
    
// Chuỗi dữ liệu cần ghi
$data = "Cộng hòa xã hội chủ nghĩa Việt Nam : Độc lập - Tự do - Hạnh phúc";
    
// Ghi dữ liệu vào tập tin
file_put_contents($file, $data, FILE_APPEND) or die("Lỗi: Không thể ghi vào tập tin.");
    
echo "Dữ liệu được ghi vào tập tin thành công";
?>

Đổi tên tập tin bằng hàm rename()

Bạn có thể đổi tên tập tin hoặc thư mục bằng cách sử dụng hàm rename() của PHP như sau:

Ví dụ

<?php
$file = "file.txt";
 
// Check the existence of file
if (file_exists($file)) {
    // Đổi tên tập tin
    if (rename($file, "newfile.txt")) {
        echo "Đổi tên thành công.";
    } else {
        echo "Lỗi: Không thể đổi tên tập tin.";
    }
} else {
    echo "Lỗi: tập tin không tồn tại.";
}
?>

Xóa tập tin bằng hàm unlink()

Bạn có thể xóa các tập tin hoặc thư mục bằng cách sử dụng hàm unlink() của PHP như sau:

Ví dụ

<?php
$file = "note.txt";
 
// Kiểm tra sự tồn tại của tập tin
if (file_exists($file)) {
    // Xóa tập tin
    if (unlink($file)) {
        echo "Xóa tập tin thành công.";
    } else{
        echo "Lỗi: Không thể xóa tập tin.";
    }
} else {
    echo "Lỗi: tập tin không tồn tại.";
}
?>


Trong chương tiếp theo, chúng ta sẽ tìm hiểu thêm về cây thư mục / thư mục trong PHP.

Các hàm hệ thống về tập tin trong PHP

Bảng sau đây cung cấp tổng quan về một số hàm hệ thống tập tin PHP hữu ích khác có thể được sử dụng để đọc và ghi tập tin động.

Dưới đây là danh sách đầy đủ các hàm hệ thống tập tin thuộc PHP 7. Các hàm này là một phần của lõi PHP nên bạn có thể sử dụng chúng trong tập lệnh của mình mà không cần cài đặt thêm.

basename() Trả về thành phần tên tập tin của một đường dẫn.
chgrp() Thay đổi nhóm tập tin.
chmod() Thay đổi chế độ tập tin.
chown() Thay đổi chủ sở hữu tập tin.
clearstatcache() Xóa bộ đệm ẩn trạng thái tập tin.
copy() Sao chép một tập tin.
delete() Xemunlink()hoặcunset()
dirname() Trả về đường dẫn của thư mục mẹ.
disk_free_space() Trả lại dung lượng khả dụng trên hệ thống tập tin hoặc phân vùng đĩa.
disk_total_space() Trả về tổng kích thước của hệ thống tập tin hoặc phân vùng đĩa.
diskfreespace() Trả lại dung lượng khả dụng trên hệ thống tập tin hoặc phân vùng đĩa.Bí danh của disk_free_space()
fclose() Đóng một con trỏ tập tin đang mở.
feof() Kiểm tra phần cuối của tập tin trên con trỏ tập tin.
fflush() Chuyển đầu ra được lưu vào bộ đệm vào một tập tin.
fgetc() Trả về một ký tự từ con trỏ tập tin.
fgetcsv() Nhận dòng từ con trỏ tập tin và phân tích cú pháp cho các trường CSV.
fgets() Đọc một số byte cụ thể từ một tập tin.
fgetss() Đọc một số byte cụ thể từ một tập tin và tách các thẻ HTML và mã PHP.
file() Đọc toàn bộ tập tin thành một mảng.
file_exists() Kiểm tra xem tập tin hoặc thư mục có tồn tại hay không.
file_get_contents() Đọc toàn bộ tập tin thành một chuỗi.
file_put_contents() Ghi một chuỗi vào một tập tin.
fileatime() Trả về thời gian truy cập cuối cùng của một tập tin.
filectime() Trả về thời gian thay đổi cuối cùng của một tập tin.
filegroup() Trả về ID nhóm của một tập tin.
fileinode() Trả về số inode của tập tin.
filemtime() Trả về thời gian sửa đổi cuối cùng của tập tin.
fileowner() Trả về ID người dùng của chủ sở hữu tập tin.
fileperms() Trả về quyền cho tập tin.
filesize() Trả về kích thước tập tin.
filetype() Trả về loại tập tin.
flock() Khóa hoặc phát hành một tập tin.
fnmatch() Đối sánh tên tập tin hoặc chuỗi với một mẫu được chỉ định.
fopen() Mở tập tin hoặc URL.
fpassthru() Xuất tất cả dữ liệu còn lại trên con trỏ tập tin.
fputcsv() Định dạng dòng dưới dạng CSV và ghi vào con trỏ tập tin.
fputs() Bí danh củafwrite()
fread() Đọc một số byte cụ thể từ một tập tin.
fscanf() Phân tích cú pháp đầu vào từ một tập tin theo định dạng được chỉ định.
fseek() Tìm kiếm con trỏ tập tin.
fstat() Trả về thông tin về tập tin bằng con trỏ tập tin đang mở.
ftell() Trả về vị trí hiện tại của con trỏ đọc / ghi tập tin.
ftruncate() Cắt ngắn một tập tin theo độ dài nhất định.
fwrite() Ghi nội dung của chuỗi vào con trỏ tập tin.
glob() Trả về một mảng tên tập tin / thư mục khớp với một mẫu được chỉ định.
is_dir() Kiểm tra xem tập tin có phải là một thư mục hay không.
is_executable() Kiểm tra xem tập tin có thực thi được không.
is_file() Kiểm tra xem tập tin có phải là tập tin thông thường hay không.
is_link() Kiểm tra xem tên tập tin có phải là một liên kết tượng trưng hay không.
is_readable() Kiểm tra xem tập tin có tồn tại và có thể đọc được hay không.
is_uploaded_file() Kiểm tra xem tập tin đã được tải lên qua HTTP POST hay chưa.
is_writable() Kiểm tra xem tên tập tin có thể ghi được không.
is_writeable() Bí danh củais_writable()
lchgrp() Thay đổi quyền sở hữu nhóm của liên kết biểu tượng.
lchown() Thay đổi quyền sở hữu của người dùng đối với liên kết biểu tượng.
link() Tạo một liên kết cứng.
linkinfo() Trả về thông tin về một liên kết.
lstat() Trả về thông tin về tập tin hoặc liên kết tượng trưng.
mkdir() Tạo một thư mục.
move_uploaded_file() Di chuyển tập tin đã tải lên đến một vị trí mới.
parse_ini_file() Phân tích cú pháp tập tin cấu hình.
parse_ini_string() Phân tích cú pháp một chuỗi cấu hình.
pathinfo() Trả về thông tin về đường dẫn tập tin.
pclose() Đóng con trỏ tập tin quy trình.
popen() Mở con trỏ tập tin quy trình.
readfile() Đọc một tập tin và ghi nó vào bộ đệm đầu ra.
readlink() Trả về đích của một liên kết tượng trưng.
realpath() Trả về tên đường dẫn tuyệt đối được chuẩn hóa.
realpath_cache_get() Trả về các mục nhập bộ nhớ đệm đường dẫn thực.
realpath_cache_size() Trả về kích thước bộ nhớ cache của đường dẫn thực.
rename() Đổi tên tập tin hoặc thư mục.
rewind() Tua lại vị trí của con trỏ tập tin.
rmdir() Loại bỏ một thư mục trống.
set_file_buffer() Đặt kích thước bộ đệm của tập tin.
stat() Trả về thông tin về một tập tin.
symlink() Tạo một liên kết tượng trưng.
tempnam() Tạo tập tin tạm thời với tên tập tin duy nhất.
tmpfile() Tạo một tập tin tạm thời duy nhất.
touch() Đặt thời gian truy cập và sửa đổi tập tin.
umask() Thay đổi umask hiện tại.
unlink() Xóa một tập tin.

 

Bài viết mới cập nhật