php读取大文件的方式

file - 把整个文件读入一个数组中

  • file(string $filename, int $flags = 0, ?resource $context = null): array|false
      print_r(file('./test.txt'));
      print_r(file('https://www.example.com/'));
          //返回的结果为数组形式
          Array
          (
              [0] => <!DOCTYPE html>
              [1] => <html lang="en">
              [2] => <head>
          ...

file_get_contents - 将整个文件读入一个字符串

  • 说明
      file_get_contents(
          string $filename,
          bool $use_include_path = false,
          resource $context = ?,
          int $offset = 0,
          int $length = ?
      ): string|false
      echo file_get_contents('./test.txt');
          //<!DOCTYPE html>
              <html lang="en">
              <head>
                  <meta charset="UTF-8">
            ...

使用fopen、feof、fgets进行一行一行的读取

  • fopen — 打开文件或者 URL

  • feof - 测试文件指针是否到了文件结束的位置

  • fgets — 从文件指针中读取一行

      $fp = fopen('./test.txt', 'r');
      $lines = [];
    
      while (!feof($fp)) {
          $lines[] = fgets($fp);
      }
    
      fclose($fp);
      //内存占用小

readfile - 输出文件

  • readfile(string $filename, bool $use_include_path = false, resource $context = ?): int
      //读取文件并写入到输出缓冲,适合下载文件
      echo readfile('./test.txt');
      $file = 'text.txt';
      if (file_exists($file)) {
          header('Content-Description: File Transfer');
          header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename="'.basename($file).'"');
          header('Expires: 0');
          header('Cache-Control: must-revalidate');
          header('Pragma: public');
          header('Content-Length: ' . filesize($file));
          readfile($file);
          exit;
      }

stream_copy_to_stream - 将数据从一个流复制到另一个

  • 说明
      tream_copy_to_stream(
          resource $from,
          resource $to,
          ?int $length = null,
          int $offset = 0
      ): int|false
      $fp = fopen('./test.txt', 'r');
      $fp1 = fopen('./test1.txt', 'w');
      stream_copy_to_stream($fp, $fp1);
      //内存占用小

fread - 读取文件(可安全用于二进制文件)

  • fread(resource $stream, int $length): string|false
      $fp = fopen('./test1.txt', 'r');
      echo fread($fp, filesize('./test1.txt'));
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
          ...

yiled - 迭代的方式

  • 代码

      function my_read_file($filename)
      {
          $fp = fopen($filename, 'r');
          while (!feof($fp)) {
             yield fgets($fp);
          }
          fclose($fp);
      }
    
      $filename = 'test.txt';
      $iter = my_read_file($filename);
    
      foreach ($iter as $value) {
         echo $value;
      }
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!