用PHP连接文件
我想知道在PHP中是否有比在用PHP连接文件,php,Php,我想知道在PHP中是否有比在a+中打开txt1更快的方法连接两个文本文件,逐行阅读txt2并将每一行复制到txt1如果您拥有PHP的命令行权限,在linux中使用cat程序可能会快得多 system('cat txt1 txt2 > txt3'); 如果您想使用纯PHP解决方案,可以使用以字符串形式读取整个文件,然后将其写出(无错误检查,只是为了说明如何执行此操作): 我发现在这里使用*nixcat是最有效的,但是如果出于任何原因您无法访问它,并且您正在连接大文件,那么您可以使用此逐行函
a+
中打开txt1
更快的方法连接两个文本文件,逐行阅读txt2
并将每一行复制到txt1
如果您拥有PHP的命令行权限,在linux中使用cat
程序可能会快得多
system('cat txt1 txt2 > txt3');
如果您想使用纯PHP解决方案,可以使用以字符串形式读取整个文件,然后将其写出(无错误检查,只是为了说明如何执行此操作):
我发现在这里使用*nix
cat
是最有效的,但是如果出于任何原因您无法访问它,并且您正在连接大文件,那么您可以使用此逐行函数。(为了简单起见,错误处理被剥离)
虽然最快的方法是不加限制地使用操作系统命令,如cp或cat,但这对于兼容性来说是不可取的 最快的“仅PHP”方式是使用file_get_内容,即一次性读取整个源文件,但它也有一些缺点。对于大型文件,它将需要大量内存,因此根据分配给PHP的内存,它可能会失败 一个通用的清洁快速解决方案是使用fread和fwrite,并使用大缓冲区 如果文件小于缓冲区,则所有读取都将在一次突发中进行,因此速度是最佳的,否则读取将在大数据块(缓冲区的大小)上进行,因此开销最小,速度相当好 如果是换行符或换行符,则使用fgets逐行阅读时,必须逐个测试每个字符。 此外,使用fgets逐行读取包含许多短行的文件会比较慢,因为您将读取许多大小不同的小片段,具体取决于换行符的位置
fread的速度更快,因为它只检查EOF(这很容易),并使用您决定的固定大小块读取文件,因此它可以成为您的操作系统、磁盘或文件类型的最佳选择(假设您有许多文件,可以使用exec在Unix中连接这些文件。如何将每一行复制到txt1?您可以使用
file\u get\u contents
一次获取整个文件。“file\u get\u contents()是将文件内容读入字符串的首选方法。如果操作系统支持,它将使用内存映射技术来提高性能。”然而,一个重要的问题是所涉及的文件有多大。我不确定file\u get\u contents
是否是连接一些GB大小的文件的最佳方法…如果您有足够的内存,并且文件不是很大,这是很好的。对于大文件,更好的解决方案应该是使用stream\u copy\u to\u stream'cat',而不是公认的内部通信和或外部,一级操作程序或批处理文件。(windows 7.PHP版本5.2.6上的Appserv)@Guttemberg抱歉,我假设这是在*nix服务器上运行的,我发现cat
同样快(慢!)Blackfire的file\u get/put\u contents
可以处理约400个1 MB的文件。cat
的缺点是你无法制作进度条。除非你的文件非常小,否则file\u get/put\u contents是非常愚蠢的。试着在php.ini中将几个1GB的文件与512M的文件连接起来;)请为您的答案添加一些解释,以便其他人可以从中学习-尤其是因为这看起来像是lufc对答案的改进
$fp1 = fopen("txt1", 'a+');
$file2 = file_get_contents("txt2");
fwrite($fp1, $file2);
$content = file_get_contents("file1");
file_put_contents("file2", $content, FILE_APPEND);
function catFiles($arrayOfFiles, $outputPath) {
$dest = fopen($outputPath,"a");
foreach ($arrayOfFiles as $f) {
$FH = fopen($f,"r");
$line = fgets($FH);
while ($line !== false) {
fputs($dest,$line);
$line = fgets($FH);
}
fclose($FH);
}
fclose($dest);
}
<?php
$BUFFER_SIZE=1*1024*1024; // 1MB, bigger is faster.. depending on file sizes and count
$dest = fopen($fileToAppendTo "a+");
if (FALSE === $dest) die("Failed to open destination");
$handle = fopen("source.txt", "rb");
if (FALSE === $handle) {
fclose($dest);
die("Failed to open source");
}
$contents = '';
while( !feof($handle) ) {
fwrite($dest, fread($handle, $BUFFER_SIZE) );
}
fclose($handle);
fclose($dest);
?>