Cách sử dụng hàm readfile() và fopens() trong PHP

Trong bài học trước chúng ta đã tìm hiểu kiến thức về form và cách xử lý giá trị form trong PHP. Trong bài viết này, tôi sẽ giới thiệu phương thức làm việc với file trong PHP. Đây là kiến thức không thể thiếu đối với bất kỳ người lập trình nào khi quyết định thiết kế website bằng ngôn ngữ PHP. Dưới đây là một số thông tin sẽ trình bày trong bài viết này.

Giới thiệu cách thức làm việc với file

Việc mở các tập tin văn bản gốc hoặc tập tin CSV thật sự cần thiết đối với bạn cũng như các lập trình viên khác. Không phải lúc nào việc lập trình cũng đòi hỏi phải có database với nhiều bảng, do vậy ý tưởng lưu trữ dữ liệu trong các file text đơn giản có thể xem là sự lựa chọn tối ưu. Đặc biệt là trong trường hợp Web Hosting không cho phép bạn tạo database.

Trong phần này, chúng ta sẽ xem xét các cách khác nhau để thao tác file trong PHP. Chúng ta sẽ bắt đầu mở một file văn bản gốc dictionary.txt, các bạn có thể download tại đây.

Khi mở file này ra và xem nội dung, ta thấy như thế này :

AAS = Alive and smiling 
ADN = Any day now 
AEAP = As early as possible 
AFAIK = As far as I know 
AFK = Away from keyboard 
AKA = Also known as

Thật ra đây là một danh sách dài các giá trị tách nhau bởi dấu “=”. Bên trái dấu “=” là cụm từ viết tắt, bên phải là nghĩa của nó.

Giờ chúng ta sẽ mở file văn bảng này bằng mã PHP, bạn sẽ thấy được các cách khác nhau để mở và làm việc với file text này.

Mở một file trong PHP bằng hàm readfile()

Để mở một file, bạn có thể dùng nhiều cách. Cách đầu tiên là chúng ta dùng hàm readfile(), hàm này có tác dụng đọc nội dung của file.

Các bạn thử đoạn script sau :

Lưu đoạn script trên thành file *.php và đặt cùng thư mục với file dictionary.txt. Hãy chạy code này và kết quả là bạn sẽ thấy màn hình chứa đầy văn bản, không có đấu phân cách và xuống dòng.

Bạn cũng có thể thay thế 02 dòng code trên bằng các cách sau :

Cách 01 :

          print readfile("dictionary.txt");

Cách 02 :

             $file_to_read = "dictionary.txt";
          print readfile($file_to_read);

Cách 03 :

           $file_to_read = "filesdictionary.txt";// trường hợp file đặt không cùng thư mục
           print readfile($file_to_read);

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 này có sẵn ở phiên bản PHP 4.3 trở lên.

Xem ví dụ :

          <?PHP

          $file_to_read = "dictionary.txt";
          print file_get_contents( $file_to_read );

          ?>

Mở một file trong PHP bằng hàm fopens()

Một phương pháp mở file hay hơn là sử dụng hàm fopen(). Hàm này cho phép bạn có nhiều tuỳ chọn hơn như mở file với thuộc tính chỉ đọc, hoặc chỉ ghi, và một số thuộc tính khác.

Ví dụ :

         <?PHP

         $file_contents = fopen( "dictionary.txt", "r" );
         print $file_contents;
         fclose($file_contents);

         ?>

Khi chạy đoạn script này, ta sẽ nhận được kết quả :

         Resource id #2

Kết quả này không giống như những gì bạn mong đợi. Lý do là fopen() thực sự không đọc nội dung của file. Tất cả những gì nó làm là thiết lập con trỏ trong file mà bạn muốn mở ra và trả về giá trị file handle (con trỏ file), bạn quan tâm tới giá trị này để lưu lại vị trí của file.

Nhưng sau khi bạn khai báo PHP ghi nhớ vị trí của file rồi, thì bạn đọc nội dung file bằng cách nào ? Có một cách đó là sử dụng hàm fget(). Hàm fget() có tác dụng đọc một số lượng ký tự xác định trên từng dòng, thường thì ta sử dụng vòng lặp để đọc từng dòng văn bản.

Trong ví dụ sau, chúng ta sẽ thực hiện in ra từng dòng riêng biệt. Khi bạn sử dụng hàm fget(), bạn cần kiểm tra khi nào sẽ kết thúc file bằng cách sử dụng hàm feof().

Ví dụ :

          <?PHP

             $file_handle = fopen("dictionary.txt", "r");

             while (!feof($file_handle)) {

             $line_of_text = fgets($file_handle);
             print $line_of_text . "<BR>";

             }

            fclose($file_handle);

         ?>

Sau khi chạy script này bạn sẽ thấy nội dung in ra trên từng dòng riêng biệt. Nhưng cách nó làm việc như thế nào ?

Ở dòng lệnh dầu tiên :

         $file_handle = fopen( "dictionary.txt", "r" );

Ở đây chúng ta yêu cầu PHP mở ra một file và ghi nhớ vị trí của nó. Vị trí được lưu trữ như một file handle. Chúng ta gán gia trị này cho biến @file_handle. Thực ra thì chúng ta chưa đọc nội dung của file mà chỉ mới yêu cầu PHP ghi nhớ file này ở đâu thôi.

Ở dòng tiếp theo là vòng lặp :

            while () {

            }

Điều kiện của vòng lặp là

            !feof( $file_handle )

Lưu ý, vòng lặp while sẽ lặp đi lặp lại cho đến khi bạn yêu cầu nó dừng lại. Nó sẽ lặp đi lặp lại khi điều kiện đúng. Điều kiện giữa hai dấu ngoặc trông khá lạ : !feof.

Hàm feof() có nghĩa là file end of file, có tác dụng báo khi nào kết thúc file. Bạn đặt file giữa hai dấu ngoặc đơn của hàm :

             feof( $file_handle )

Chúng ta dùng toán tử NOT (!) để duy trì vòng lặp khi chưa duyệt tới cuối file.

          while ( !feof( $file_handle ) ) {

          }

Giải thích : khi chưa kết thúc file, vòng lặp sẽ trỏ đến $file_handle. Khi kết thúc file, vòng lặp sẽ dừng lại.

Bên trong vòng lặp, dòng đầu tiên là :

          $line_of_text = fgets( $file_handle );

Ta sử dụng hàm fgets để lấy một dòng text từ file. Chúng ta lại sử dụng file handle :

             fgets( $file_handle );

Như vậy chúng ta sẽ lấy một dòng từ file, gán dòng đó vào một biến, sau đó ta in nó ra :

          print $line_of_text . "<BR>";

Dòng cuối cùng của code là

             fclose( $file_handle );

Dòng này có tác dụng đóng file lại, nó báo cho PHP biết rằng con trỏ file không cần thiết nữa. Bạn lưu ý phải luôn đóng file khi mở file bằng fopen().

Một điểm cần lưu ý là hàm fgets() còn có thêm một cú pháp liên quan đến kích thước của dòng text :

          fgets($file_handle, line_size);

Kích thước của dòng text được tình bằng đơn vị byte, mặc định là 1024 byte. Kích thước này chỉ cho phép có hoặc không từ phiên bản PHP 4.2 trở đi, nếu phiên bản PHP thấp hơn thì bạn sẽ nhận thông báo lỗi nếu bỏ qua thông số line_size

          fgets($file_handle, 1024);

Nếu bạn thật sự muốn gói gọn nhiều thông tin trên một dòng, thì bạn có thể tăng chỉ số line size.

Vận dụng các nội dung trên ta có thể tạo bộ đếm lượt truy cập trong PHP, đây là ứng dụng được sử dụng trong khá nhiều website hiện nay.

Bài viết mới nhất

Google Plus

HotLine 0945 518 538

Tel 0906 308 380

Email : thietkeweb.123corp@gmail.com

Trụ sở chính: 60 Nguyễn Đình Chiểu, P.Đakao, Q.1, TPHCM
VPĐD: 14 Phạm Quý Thích, P.Tân Quý, Q.Tân Phú, TPHCM

Hotline 1: 0945 518 538 Email: thietkeweb.123corp@gmail.com
Back To Top