Nhập và xuất tệp trong php

Làm việc với các tệp trên môi trường phía máy chủ là một nhiệm vụ phổ biến nhưng nó vẫn phức tạp. Tuy nhiên, hầu hết các cài đặt PHP không cung cấp đủ bộ nhớ để xử lý các tệp lớn

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách xử lý các tệp lớn trong PHP bằng cách sử dụng khái niệm luồng

Mục lục

điều kiện tiên quyết

Để làm theo cùng với hướng dẫn này, bạn sẽ cần những điều sau đây

  • Kiến thức cơ bản về PHP
  • Các khái niệm cơ bản trong luồng PHP
  • Môi trường phát triển địa phương

mục tiêu

Hướng dẫn này sẽ hướng dẫn bạn cách xử lý các tệp lớn trong PHP bằng các luồng. Cuối cùng, bạn sẽ đánh giá cao những lợi ích của luồng so với hệ thống tệp truyền thống

Bắt đầu với luồng

Luồng là một khái niệm hấp dẫn trong PHP. Nó cho phép bạn xử lý các tệp lớn mà không gặp vấn đề về bộ nhớ

Luồng đơn giản hóa quá trình đọc và ghi tệp. Chúng hoạt động bằng cách cung cấp cách đọc và ghi dữ liệu theo khối

Việc đọc dữ liệu theo yêu cầu này đảm bảo rằng bạn không phải tải toàn bộ tệp vào bộ nhớ

Điều quan trọng cần lưu ý là cài đặt PHP có giới hạn bộ nhớ. Vì vậy, nếu bạn cố tải một tệp quá lớn, bạn sẽ gặp lỗi. Các luồng có trình bao bọc triển khai cho phép bạn xử lý các giao thức cụ thể

Trình xử lý hệ thống tập tin

Để hiểu trình xử lý hệ thống tệp, hãy tạo một tệp có tên test.txt trong thư mục

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
0

Tiếp tục và thêm văn bản trong tệp. Trong trường hợp của chúng tôi, test.txt sẽ chứa văn bản sau

hello world

Tiếp theo, mở tệp

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
2 và thêm đoạn mã sau

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;

Trong đoạn mã trên, chúng tôi đang sử dụng hàm

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
3 để đọc nội dung của tệp

Khi chúng tôi chạy đoạn mã trên, chúng tôi nhận được kết quả sau

hello world

Bạn để ý code chạy mượt mà. Tuy nhiên, điều này không phải lúc nào cũng đúng khi xử lý các tệp lớn, như minh họa bên dưới

php
$content = file_get_contents(__DIR__ . '/large-test-file.txt');
echo $content;

Khi đoạn mã trên được chạy, bạn sẽ gặp lỗi sau

# php fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 524288 bytes) in /tmp/streams.php on line 3
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1048576000 bytes)

Lỗi trên là do file tải vào bộ nhớ quá lớn. Như chúng ta có thể nhớ lại, PHP có giới hạn bộ nhớ được đặt thành

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
4

Bây giờ chúng ta đã hiểu vấn đề xử lý các tệp lớn, hãy giới thiệu khái niệm luồng trong phần tiếp theo

Làm việc với luồng

Trước đây, chúng ta đã thấy cách các cấu hình mặc định của PHP hạn chế chúng ta hoạt động trong giới hạn bộ nhớ đã đặt

Trong phần này, trước tiên hãy tạo một tập lệnh mẫu để giải quyết lỗi trên của chúng ta bằng cách sử dụng khái niệm luồng

//open the stream.php file and add the following:
php
$large_file = fopen(__DIR__ . '/large-test-file.txt', 'r');
//the result is printed until the end of the file
while(! feof($large_file)) {
  $endLine = fgets($large_file);
  echo $endLine. "
"
;
} fclose($large_file);

Chúng ta sử dụng hàm

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
5 để mở tệp trong đoạn mã trên. Hàm
php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
5 nhận 2 tham số. Đầu tiên là đường dẫn tệp và thứ hai là chế độ

Tiếp theo, chúng ta sử dụng hàm

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
7 để đọc nội dung của tệp. Cuối cùng, chúng ta sử dụng hàm
php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
8 để đóng tệp

Khi bạn thực thi đoạn mã trên, bạn nhận thấy rằng nó không báo lỗi cho bạn, như trường hợp chúng ta sử dụng hàm

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
3. Đây là sức mạnh của dòng chảy

Với luồng, chúng tôi có thể đọc bất kỳ kích thước tệp nào mà không gặp phải sự cố quản lý bộ nhớ có thể gây khó chịu cho nhà phát triển

Truy xuất nội dung tệp

Trong phần trước, chúng ta đã thấy cách chúng ta có thể sử dụng sức mạnh của luồng trong PHP để xử lý các tệp lớn, trong trường hợp của chúng ta, sử dụng hàm

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
5

Bây giờ, hãy hiểu cách truy xuất nội dung của tệp bằng cách sử dụng hàm

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
7

...
while(! feof($large_file)) {
  $endLine = fgets($large_file);
  echo $endLine. "
"
;
} ...

Trong đoạn mã trên, chúng ta có một vòng lặp

hello world
2 sẽ chạy cho đến hết tệp. Hàm
hello world
3 sẽ trả về
hello world
4 nếu đến cuối tệp

Tiếp theo, hàm

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
7 lấy luồng tệp làm tham số đầu tiên. Sau đó, chúng tôi sử dụng hàm
hello world
6 để in nội dung của tệp

Viết vào một tập tin

Bây giờ chúng ta đã hiểu cách đọc nội dung tệp bằng cách sử dụng khái niệm luồng, hãy tìm hiểu cách ghi vào tệp trong phần này

Hãy tạo một tệp khác có tên là

hello world
7 trong thư mục
php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
0 để đơn giản hóa mã luồng của chúng tôi

Ghi chú. chúng tôi đã tạo một tệp có tên test.txt trong thư mục

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
0. Bạn nên tạo nó nếu nó không có ở đó

Trong đoạn script sau, chúng tôi sẽ đọc nội dung của tệp test.txt và ghi nó vào tệp

hello world
7 như mô tả bên dưới

php
//open the stream.php file and add the following:
// the source file
$file_stream_source = fopen(__DIR__ . '/test.txt', 'r');
// the destination file
$file_stream_destination = fopen(__DIR__ . '/test2.txt', 'w');
// while the end of the file is not reached
while (true) {
  // read the file
    $file_line = fgets($file_stream_source);
    // if the end of the file is reached
    if (!$file_line) {
      // break the loop
        break;
    }
    // write the file to the destination file
    fputs($file_stream_destination, $file_line);
}
// close the source file
fclose($file_stream_destination);
// close the destination file
fclose($file_stream_source);

đầu ra

# contents of the test.txt file equal to the test2.txt file

Khi bạn thực thi đoạn script trên, bạn nhận thấy rằng nội dung của tệp test.txt được ghi vào tệp

hello world
7

Điều này đạt được trong tập lệnh trên bằng cách sử dụng hàm

php
$content = file_get_contents(__DIR__ . '/large-test-file.txt');
echo $content;
5. Hàm
php
$content = file_get_contents(__DIR__ . '/large-test-file.txt');
echo $content;
5 lấy luồng tệp làm tham số đầu tiên và nội dung của tệp làm tham số thứ hai

Trước tiên, chúng tôi mở tệp nguồn bằng cách sử dụng chức năng

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
5. Hàm
php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
5 nhận 2 tham số, tham số đầu tiên là đường dẫn tệp và tham số thứ hai là chế độ

Tiếp theo ta dùng vòng lặp

php
$content = file_get_contents(__DIR__ . '/large-test-file.txt');
echo $content;
9 để kiểm tra xem đã đến cuối file chưa. Chúng tôi đọc từng dòng tệp bên trong vòng lặp bằng hàm
php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
7

Tuy nhiên, chúng tôi cũng kiểm tra xem có đến cuối dòng không. Nếu có, chúng tôi phá vỡ vòng lặp. Mặt khác, chúng tôi ghi dòng vào tệp đích bằng hàm

php
$content = file_get_contents(__DIR__ . '/large-test-file.txt');
echo $content;
5

Cuối cùng, chúng tôi đóng tệp nguồn và tệp đích bằng cách sử dụng hàm

php
$content = file_get_contents(__DIR__ . '/test.txt');
echo $content;
8

Phần kết luận

Trong bài viết này, chúng tôi đã trình bày rộng rãi các khái niệm về luồng và cách sử dụng chúng trong PHP

Tôi hy vọng bài viết này giúp bạn xây dựng nền tảng vững chắc về những khái niệm này để giúp bạn xây dựng nền tảng vững chắc về PHP

Làm cách nào để mở tệp cho đầu vào và đầu ra trong PHP?

Vì vậy, đây là các bước cần thiết để đọc một tệp bằng PHP. .
Mở tệp bằng hàm fopen()
Lấy độ dài của tệp bằng hàm filesize()
Đọc nội dung của tệp bằng hàm fread()
Đóng tệp bằng hàm fclose()

Các thao tác vào ra tệp là gì?

Các thao tác nhập/xuất chẳng hạn như mở, đóng, đọc, ghi và nối thêm , tất cả đều xử lý các tệp băng hoặc đĩa tiêu chuẩn. Thuật ngữ này sẽ được sử dụng để chỉ các hoạt động tệp thông thường trái ngược với I/O hệ thống cấp thấp, chẳng hạn như xử lý các trang bộ nhớ ảo hoặc bảng nội dung của hệ điều hành.

Làm cách nào để lấy giá trị của tệp loại đầu vào trong PHP?

Câu trả lời của bạn . Use PHP's $_POST or $_GET superglobals to retrieve the value of the input tag via the name of the HTML tag.

Làm cách nào để chèn tệp trong PHP?

Tải lên tệp PHP .
Định cấu hình "php. ini" Tập tin. Trước tiên, hãy đảm bảo rằng PHP được định cấu hình để cho phép tải tệp lên. .
Kiểm tra xem tệp đã tồn tại chưa. Bây giờ chúng ta có thể thêm một số hạn chế. .
Kích thước tệp giới hạn. Trường nhập tệp trong biểu mẫu HTML của chúng tôi ở trên được đặt tên là "fileToUpload". .
Loại tệp giới hạn. .
Hoàn thành tải lên tệp PHP Script