用PHP连接文件

用PHP连接文件,php,Php,我想知道在PHP中是否有比在a+中打开txt1更快的方法连接两个文本文件,逐行阅读txt2并将每一行复制到txt1如果您拥有PHP的命令行权限,在linux中使用cat程序可能会快得多 system('cat txt1 txt2 > txt3'); 如果您想使用纯PHP解决方案,可以使用以字符串形式读取整个文件,然后将其写出(无错误检查,只是为了说明如何执行此操作): 我发现在这里使用*nixcat是最有效的,但是如果出于任何原因您无法访问它,并且您正在连接大文件,那么您可以使用此逐行函

我想知道在PHP中是否有比在
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);

?>