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 协议》,转载必须注明作者和本文链接