13

我想知道在 PHP 中连接 2 个文本文件是否txt1a+txt2txt1.

4

5 回答 5

15

如果您想使用纯 PHP 解决方案,您可以使用file_get_contents以字符串形式读取整个文件,然后将其写出(没有错误检查,只是为了展示您如何做到这一点):

$fp1 = fopen("txt1", 'a+');
$file2 = file_get_contents("txt2");
fwrite($fp1, $file2);
于 2013-07-01T15:04:41.500 回答
14

cat如果您有 PHP 的命令行权限,在 linux中使用该程序可能会快得多

system('cat txt1 txt2 > txt3');
于 2013-07-01T15:03:47.717 回答
9
$content = file_get_contents("file1");
file_put_contents("file2", $content, FILE_APPEND);
于 2014-05-29T11:14:25.940 回答
5

我发现在这里使用 *nixcat是最有效的,但是如果由于某种原因您无法访问它,并且您正在连接大文件,那么您可以逐行使用这个函数。(为简单起见,删除了错误处理)。

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);

}
于 2018-11-12T17:19:03.930 回答
1

虽然最快的方法无疑是使用操作系统命令,如 cp 或 cat,但这对于兼容性来说几乎是不可取的。

最快的“仅 PHP”方式是使用 file_get_contents,它可以一次性读取整个源文件,但它也有一些缺点。大文件需要大量内存,因此它可能会失败,具体取决于分配给 PHP 的内存。

一个通用的干净和快速的解决方案是使用带有大缓冲区的 fread 和 fwrite。

如果文件小于缓冲区,所有读取将在一次突发中发生,因此速度是最佳的,否则读取发生在大块(缓冲区的大小)上,因此开销最小并且速度非常好。

使用 fgets 逐行读取,必须逐个测试每个字符,如果它是换行符或换行符。此外,使用 fgets 逐行读取包含许多短行的文件会更慢,因为您将读取许多不同大小的小片段,具体取决于换行符的位置。

fread 更快,因为它只检查 EOF(这很容易)并使用您决定的固定大小的块读取文件,因此它可以针对您的操作系统或磁盘或文件类型进行优化(假设您有许多文件 <12k 可以将缓冲区大小设置为 16k,以便一次性读取它们)。

// 代码在Stack Overflow里面未经测试写在手机上,来自网上的各种例子,你也可以查看。

<?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);

?>
于 2020-05-25T06:48:12.943 回答