Có nhiều cách để đọc nội dung một tập tin. Bài viết này sẽ cố gắng trình bày hết các cách chủ yếu, và cả cách truy xuất các dạng tập tin nén được PHP hỗ trợ. Mục đích của tôi là giúp bạn sử dụng uyển chuyển các hàm của PHP khi một vài cái bị cấm (khai báo trong disable_functions), biết được công dụng một số hàm đặc biệt có hiệu quả cao...
PHP có cung câp sẵn một hàm làm việc này: readfile() có cú pháp
Mã lệnh (PHP) |
int readfile ( string filename [, int use_include_path] ) |
Thí dụ sau in nội dung tập tin data.txt ra màn hình
Mã lệnh (PHP) |
readfile('data.txt'); |
Tuy nhiên, không hiểu vì sao có một số host cấm dùng hàm này. Tôi sẽ cung cấp một số cách khác. Trước hết là dùng fpassthru()
Mã lệnh (PHP) |
int fpassthru ( int fp ) |
Đối số của hàm này là file pointer, nó sẽ in nội dung của tập tin được tham chiếu bởi fp, từ vị trí hiện tại đến hết tập tin. Thí dụ sau cũng sẽ in nội dung tập tin data.txt ra màn hình:
Mã lệnh (PHP) |
$fp = fopen('data.txt', 'r');
fpassthru($fp); fclose($fp); |
Bạn có thể viết đoạn mã trên ngắn gọn hơn, chỉ 1 dòng:
Mã lệnh (PHP) |
fpassthru(fopen('data.txt', 'r')); |
Cách cuối dùng, là đọc ghi tập tin bình thường. Thí dụ:
Mã lệnh (PHP) |
$fp = fopen('data.txt', 'r');
while(!feof($fp)) { print fread($fp, 4096); } |
Cách cuối cùng này tuy dài nhất, nhưng lại tốn ít bộ nhớ nhất. Thật vậy, mỗi lần nó chỉ đọc tối đa 4K, trong khi các cách trên đọc toàn bộ nội dung vào bộ nhớ rồi mới in ra - sẽ tốn bộ nhớ đáng kể nếu bạn đọc các tập tin vài MB.
Bạn muốn xuất nội dung tập tin PHP, nhưng các mã PHP được định dạng đẹp như bài viết này? Có 2 cách để làm điều đó khá đơn giản. Cách đầu tiên, đơn giản nhất như thí dụ này:
Mã lệnh (PHP) |
highlight_file('test.php'); |
Bạn có thể lưu kết quả vào chuỗi thay vì xuất ra màn hình:
Mã lệnh (PHP) |
$colored_source = highlight_file('test.php', TRUE); |
Một cách khác là dùng hàm highlight_string, giả sử bạn đã đọc nội dung test.php vào $source, giờ ta in nó ra màn hình:
Mã lệnh (PHP) |
highlight_string($source); |
Gzip là một chuẩn nén còn tốt hơn cả zip và rar của Windows. Thông thường, người ta gộp nhiều tập tin vào trong một file .tar, rồi nén lại thành .tar.gz (hoặc .tgz). Như vậy, mỗi tập tin .gz chỉ chứa 1 tập tin không nén. Trong phần này tôi sẽ giới thiệu cách đọc/ghi tập tin gzip.
Bạn dùng các hàm sau để thao tác, nói chung cũng giống như xử lí tập tin thông thường, nhưng có thêm tiền tố gz:
Mã lệnh (PHP) |
int readgzfile ( string filename [, int use_include_path] ) // đọc tập tin, giải nén và in ra màn hình
int gzpassthru ( resource zp ) // đọc các thông tin còn lại của zp (một pointer trỏ đến tập tin đang mở), in ra màn hình resource gzopen ( string filename, string mode [, int use_include_path] ) // mở tập tin nén string gzgets ( resource zp, int length ) // đọc 1 dòng int gzputs ( resource zp, string str [, int length] ) // ghi 1 dòng string gzread ( resource zp, int length ) // đọc length bytes (không nén) int gzeof ( resource zp ) // dấu hiệu kết thúc tập tin int gzclose ( resource zp ) // đóng tập tin đã mở |
Sau đây là thí dụ minh hoạ các hàm trên
Mã lệnh (PHP) |
<? $data = "Xin chào các bạn\nCó vui không?"; // ghi $data vào data.gz $zp = gzopen("data.gz", "wb"); gzputs($zp, $data); gzclose($zp); // đọc từng dòng và in ra $zp = gzopen("data.gz", "rb"); while (!gzeof($zp)) { echo gzread($zp, 1024); } gzclose($zp); // đọc toàn bộ readgzfile("data.gz"); ?> |