Các hàm xử lý file trong PHP
Trong hướng dẫn này, bạn sẽ học cách tạo, truy cập (hoặc đọc) và thao tác động các tệp (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 tệp trong PHP
Vì PHP là ngôn ngữ lập trình phía máy chủ nên 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 máy chủ web. Trong 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 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 tệp PHP.
Mở tệp bằng hàm fopen()
Để làm việc với một tệp, trước tiên bạn cần mở tệp. Hàm fopen()
được sử dụng để mở một tệp. Cú pháp cơ bản của hàm này như sau:
Tham số đầu tiên được truyền vào hàm fopen()
là tên của tệp bạn muốn mở và tham số thứ hai chỉ định tệp sẽ được mở ở chế độ nào. Ví dụ:
Ví dụ
<?php
$handle = fopen("data.txt", "r");
?>
Tệp có thể được mở ở một trong các chế độ sau:
- r Mở tệp chỉ để đọc.
- r+ Mở tệp để đọc và ghi.
- w Chỉ mở tệp để ghi 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à ghi 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. Chỉ mở tệp để ghi. Bảo quản nội dung tệp bằng cách ghi 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à ghi. Bảo quản nội dung tệp bằng cách ghi vào cuối tệp. Nếu tệp không tồn tại, PHP sẽ cố gắng tạo nó.
- x Chỉ mở tệp để ghi. Trả lại giá trị 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à 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 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 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 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 PHP .
Đóng tệp bằng hàm fclose()
Khi bạn đã làm việc xong với một tệp, nó cần được đóng lại. Hàm fclose()
được sử dụng để đóng tập tin, như trong ví dụ sau:
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 đang mở khi tập lệnh kết thúc, nhưng bạn nên đóng một tệp sau khi thực hiện tất cả các thao tác.
Đọc dữ liệu từ tệp với hàm fread()
Bây giờ bạn đã hiểu cách mở và đóng tệp. Trong phần sau, bạn sẽ học cách đọc dữ liệu từ một tệp. PHP có một số chức năng để đọc dữ liệu từ một tệp. Bạn có thể đọc chỉ từ một ký tự đến toàn bộ tệp 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à.
Hàm này nhận hai tham số - Một làm tệp cần xử lý và số byte để đọc. Ví dụ sau đây đọc 20 byte từ tệp "data.txt" bao gồm cả dấu cách. Giả sử tệp "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
$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
fclose($handle);
// Hiển thị nội dung vừa đọc
echo $content;
} else{
echo "Lỗi: Tệp không tồn tại.";
}
?>
Ví dụ trên sẽ tạo ra kết quả sau:
Đọc toàn bộ nội dung của một tệp
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
$handle = fopen($file, "r") or die("Lỗi: Không thể đọc tệp.");
// Đọc nội dung tệp
$content = fread($handle, filesize($file));
// Đóng tệp
fclose($handle);
// Hiển thị nội dung vừa đọc
echo $content;
} else{
echo "Lỗi: tệp không tồn tại.";
}
?>
Ví dụ trên sẽ tạo ra kết quả sau:
Cách dễ nhất để đọc toàn bộ nội dung của tệp 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ụ sau sẽ tạo ra cùng một kết quả như ví dụ trên:
Ví dụ
<?php
$file = "data.txt";
// Kiểm tra sự tồn tại của tệp
if(file_exists($file)){
// Đọc và xuất ra kết quả
readfile($file) or die("Lỗi: Không thể đọc tệp.");
} else{
echo "Lỗi: tệp không tồn tại.";
}
?>
Ví dụ trên sẽ tạo ra kết quả sau:
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à 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, và đọc toàn bộ tệp đó thành một biến chuỗi. Đây là một ví dụ:
Ví dụ
<?php
$file = "data.txt";
// Kiểm tra sự tồn tại của tệp
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 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 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.
Để xử lý dữ liệu tệp, 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 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 bằng hàm fwrite()
Tương tự, bạn có thể ghi dữ liệu vào một tệp hoặc nối vào tệp 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:
Hàm fwrite()
phải có hai tham số - Một tệp tin để xử lý và chuỗi dữ liệu cần được thêm vào, như thể hiện trong ví dụ sau:
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 "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 "note.txt" đã tồn tại, PHP sẽ xóa nội dung của tệp này, nếu có, trước khi ghi dữ liệu mới, tuy nhiên, nếu bạn chỉ muốn nối tệp 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 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 cùng với dữ liệu được ghi vào tệp. Đây là một ví dụ:
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 được chỉ định trong hàm file_put_contents()
đã tồn tại, PHP sẽ ghi đè tệp đó theo mặc định. Nếu bạn muốn giữ lại nội dung của tệp, 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 thay vì ghi đè lên. Đây là một ví dụ:
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 bằng hàm rename()
Bạn có thể đổi tên tệp 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 bằng hàm unlink()
Bạn có thể xóa các tệp 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
if(file_exists($file)){
// Xóa tệp
if(unlink($file)){
echo "Xóa tệp thành công.";
} else{
echo "Lỗi: Không thể xóa tệp.";
}
} else{
echo "Lỗi: Tệp 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 của 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 PHP hữu ích khác có thể được sử dụng để đọc và ghi tệp động.
Dưới đây là danh sách đầy đủ các hàm hệ thống tệp 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 của một đường dẫn. |
chgrp() |
Thay đổi nhóm tệp. |
chmod() |
Thay đổi chế độ tệp. |
chown() |
Thay đổi chủ sở hữu tệp. |
clearstatcache() |
Xóa bộ đệm ẩn trạng thái tệp. |
copy() |
Sao chép một tệp. |
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 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 hoặc phân vùng đĩa. |
diskfreespace() |
Trả lại dung lượng khả dụng trên hệ thống tệp hoặc phân vùng đĩa.Bí danh củadisk_free_space() |
fclose() |
Đóng một con trỏ tệp đang mở. |
feof() |
Kiểm tra phần cuối của tệp trên con trỏ tệp. |
fflush() |
Chuyển đầu ra được lưu vào bộ đệm vào một tệp. |
fgetc() |
Trả về một ký tự từ con trỏ tệp. |
fgetcsv() |
Nhận dòng từ con trỏ tệp 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. |
fgetss() |
Đọc một số byte cụ thể từ một tệp và tách các thẻ HTML và mã PHP. |
file() |
Đọc toàn bộ tệp thành một mảng. |
file_exists() |
Kiểm tra xem tệp hoặc thư mục có tồn tại hay không. |
file_get_contents() |
Đọc toàn bộ tệp thành một chuỗi. |
file_put_contents() |
Ghi một chuỗi vào một tệp. |
fileatime() |
Trả về thời gian truy cập cuối cùng của một tệp. |
filectime() |
Trả về thời gian thay đổi cuối cùng của một tệp. |
filegroup() |
Trả về ID nhóm của một tệp. |
fileinode() |
Trả về số inode của tệp. |
filemtime() |
Trả về thời gian sửa đổi cuối cùng của tệp. |
fileowner() |
Trả về ID người dùng của chủ sở hữu tệp. |
fileperms() |
Trả về quyền cho tệp. |
filesize() |
Trả về kích thước tệp. |
filetype() |
Trả về loại tệp. |
flock() |
Khóa hoặc phát hành một tệp. |
fnmatch() |
Đối sánh tên tệp hoặc chuỗi với một mẫu được chỉ định. |
fopen() |
Mở tệp hoặc URL. |
fpassthru() |
Xuất tất cả dữ liệu còn lại trên con trỏ tệp. |
fputcsv() |
Định dạng dòng dưới dạng CSV và ghi vào con trỏ tệp. |
fputs() |
Bí danh củafwrite() |
fread() |
Đọc một số byte cụ thể từ một tệp. |
fscanf() |
Phân tích cú pháp đầu vào từ một tệp theo định dạng được chỉ định. |
fseek() |
Tìm kiếm con trỏ tệp. |
fstat() |
Trả về thông tin về tệp bằng con trỏ tệp đang mở. |
ftell() |
Trả về vị trí hiện tại của con trỏ đọc / ghi tệp. |
ftruncate() |
Cắt ngắn một tệp theo độ dài nhất định. |
fwrite() |
Ghi nội dung của chuỗi vào con trỏ tệp. |
glob() |
Trả về một mảng tên tệp / thư mục khớp với một mẫu được chỉ định. |
is_dir() |
Kiểm tra xem tệp có phải là một thư mục hay không. |
is_executable() |
Kiểm tra xem tệp có thực thi được không. |
is_file() |
Kiểm tra xem tệp có phải là tệp thông thường hay không. |
is_link() |
Kiểm tra xem tên tệp 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 có tồn tại và có thể đọc được hay không. |
is_uploaded_file() |
Kiểm tra xem tệp đã được tải lên qua HTTP POST hay chưa. |
is_writable() |
Kiểm tra xem tên tệp 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 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 đã tải lên đến một vị trí mới. |
parse_ini_file() |
Phân tích cú pháp tệp 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. |
pclose() |
Đóng con trỏ tệp quy trình. |
popen() |
Mở con trỏ tệp 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 hoặc thư mục. |
rewind() |
Tua lại vị trí của con trỏ tệp. |
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. |
stat() |
Trả về thông tin về một tệp. |
symlink() |
Tạo một liên kết tượng trưng. |
tempnam() |
Tạo tệp tạm thời với tên tệp duy nhất. |
tmpfile() |
Tạo một tệp tạm thời duy nhất. |
touch() |
Đặt thời gian truy cập và sửa đổi tệp. |
umask() |
Thay đổi umask hiện tại. |
unlink() |
Xóa một tệp. |