乐趣区

关于php:PHP中的文件对比扩展

文件比照这个扩大当初用得比拟少,因为大部分状况下咱们都在应用一些代码管理工具,比方 Git 或者 Svn 之类的,其实它的作用就十分相似这类工具,另外还有一个十分罕用的 Beyond Compare 工具也能不便地让咱们可能进行文件的比照。

装置及筹备工作

在 PHP 中的这个文件扩大叫做 xdiff 扩大,咱们能够间接在 pecl 中下载并装置。

须要留神的是,装置这个扩大须要操作系统装置 libxdiff 工具,在文章最下方的参考链接中有这个工具的官网地址。libxdiff 无奈应用默认的 yum 装置,所以须要下载之后自行装置。和其它的 Linux 工具一样,装置过程非常简单,这里就不多赘述了。

xdiff 扩大反对字符串和文件两种模式的差别比照以及一些相干的操作,这里咱们以字符串的操作为主进行解说,文件相干的操作将在最初给出全副的操作函数用法。首先,咱们须要定义一些字符串以及相干的文件便于后续的操作。

$old_article = " 我本有为野客,飘飘浪迹世间。一时被命住名山。未免随机应变。识破尘劳扰扰,何如乐取安闲。流霞细酌咏诗篇。且与白云为伴。";
$new_article = " 我本有为野客,飘飘浪迹世间。一时被命住名山。未免随机应变。识破尘劳扰扰,何如乐取安闲。一
流霞细酌咏诗篇。且与白云为伴。";
$new_article1 = " 我本有为野客,飘飘浪迹世间。一时被命住名山。未免随机应变。二
识破尘劳扰扰,何如乐取安闲。流霞细酌咏诗篇。且与白云为伴。三一四一 ";

file_put_contents('old_file.txt', $old_article);
file_put_contents('new_file.txt', $new_article);
file_put_contents('new_file1.txt', $new_article1);

字符串差异

$diff = xdiff_string_diff($old_article, $new_article);
var_dump($diff);
// string(273) "@@ -1,4 +1,4 @@
//  我本有为野客,飘飘浪迹世间。//  一时被命住名山。未免随机应变。// - 识破尘劳扰扰,何如乐取安闲。// + 识破尘劳扰扰,何如乐取安闲。一
//  流霞细酌咏诗篇。且与白云为伴。// \ No newline at end of file
// "

应用 xdiff_string_diff() 函数就能够取得两段字符串中的差别信息。能够看到它的内容构造和 Git 的文件差别比照返回的内容十分类似。像用 +、– 号示意的那一行的差别,咱们只有应用过 Git 或 Svn 就肯定不会生疏。

合并字符串

var_dump(xdiff_string_merge3($old_article, $new_article, $new_article1, $error));
// string(180) " 我本有为野客,飘飘浪迹世间。// 一时被命住名山。未免随机应变。// 识破尘劳扰扰,何如乐取安闲。一
// 流霞细酌咏诗篇。且与白云为伴。"
var_dump($error); // NULL

xdiff_string_merge3() 函数用于将三个字符串合并到一起,也是相似于 Git 中的 merge 性能。不过这个函数须要三个字符串,然而通过测试咱们发现只有第一个 \$new_article 和原始的 $old_article 合并胜利了。第三个 $new_article1 并没有合并到最初返回的字符串中。对于这个函数的性能和理论的成果并不统一的问题并没有找到任何相干的参考资料,官网文档的介绍也十分地简略,所以如果大家如果有晓得这个函数的实在具体情况的,能够留言一起探讨哦!

$error 参数是一个可选的援用参数,如果合并过程中呈现任何问题它将返回错误信息。

修补数据(补丁)

var_dump(xdiff_string_patch($old_article, $diff, XDIFF_PATCH_NORMAL, $errors));
// string(180) " 我本有为野客,飘飘浪迹世间。// 一时被命住名山。未免随机应变。// 识破尘劳扰扰,何如乐取安闲。一
// 流霞细酌咏诗篇。且与白云为伴。"
var_dump($errors); // NULL

从函数的名称中的 patch 就能看出,这个 xdiff_string_patch() 是为差别字符串打补丁用的。在已经的桌面时代,不论是操作系统还是各种游戏,都常常会更新各种补丁。这里的补丁其实和合并差别比拟相似。它的第一个参数是原始的字符串,第二个参数是 xdiff_string_diff() 生成的差别数据,打补丁的后果就是返回正式的全并差别之后的字符串。

第三个参数是可选的,它还能够定义成 XDIFF_PATCH_REVERSE,也就是反转补丁,只返回原始的数据,不返回差别合并后的后果。反过来说,应用这个参数咱们能够将第一个参数设置为批改后的 $new_article,而后反转回原始的数据,大家能够自行尝试一下。最初的参数同样是可选的援用类型的谬误变量。

二进制修补数据

$patchBinary = xdiff_string_bdiff($old_article, $new_article);
var_dump($patchBinary);
// string(44) "�{�N��一
//     流霞细酌�!"

var_dump(xdiff_string_bdiff_size($patchBinary)); // int(180)
var_dump(xdiff_string_bpatch($old_article, $patchBinary));
// string(180) " 我本有为野客,飘飘浪迹世间。// 一时被命住名山。未免随机应变。// 识破尘劳扰扰,何如乐取安闲。一
// 流霞细酌咏诗篇。且与白云为伴。"

除了原文的字符串操作之外,咱们还能够应用 xdiff_string_bdiff() 返回二进制的字符串差别后果。同样地,应用 xdiff_string_bpatch() 能够对这个二进制的字符串操作后果打补丁,也就是合并差别。另外在二进制操作中还有一个函数 xdiff_string_bdiff_size() 用于返回二进制差别函数所返回的后果中的字符长度。

$raPatchBinary = xdiff_string_rabdiff($old_article, $new_article1);
var_dump($raPatchBinary);
// string(46) "�{�N�X 二 XY
//     三一四一 "

var_dump(xdiff_string_bdiff_size($raPatchBinary)); // int(193)
var_dump(xdiff_string_bpatch($old_article, $raPatchBinary));
// string(193) " 我本有为野客,飘飘浪迹世间。// 一时被命住名山。未免随机应变。二
// 识破尘劳扰扰,何如乐取安闲。// 流霞细酌咏诗篇。且与白云为伴。// 三一四一 "

最初还有一个 xdiff_string_rabdiff(),也是返回二进制的数据差别信息的。它和 xdiff_string_bdiff() 的区别次要是应用的算法不同。

文件操作

下面咱们具体地介绍了 xdiff 扩大对于字符串的操作。它同时还提供了一系列的针对文件的操作,应用这些间接操作文件的函数就真的和咱们的 Git 之类的工具十分相似了。

$old_file = 'old_file.txt';
$new_file = 'new_file.txt';
$new_file1 = 'new_file1.txt';
$diff_file = 'file.diff';
$merge_file = 'merge.txt';
$patch_file = 'patch.diff';

echo "File Diff:", PHP_EOL;
$patch = xdiff_file_diff($old_file, $new_file, $diff_file);
var_dump($patch); // bool(true)
var_dump(file_get_contents($diff_file));
// string(273) "@@ -1,4 +1,4 @@
//  我本有为野客,飘飘浪迹世间。//  一时被命住名山。未免随机应变。// - 识破尘劳扰扰,何如乐取安闲。// + 识破尘劳扰扰,何如乐取安闲。一
//  流霞细酌咏诗篇。且与白云为伴。// \ No newline at end of file
// "echo'File Merge: ', PHP_EOL;
var_dump(xdiff_file_merge3($old_file, $new_file,  $new_file1, $merge_file));
// string(307) "@@ -1,4 +1,5 @@
//  我本有为野客,飘飘浪迹世间。// - 一时被命住名山。未免随机应变。// + 一时被命住名山。未免随机应变。二
//  识破尘劳扰扰,何如乐取安闲。// - 流霞细酌咏诗篇。且与白云为伴。+ 流霞细酌咏诗篇。且与白云为伴。// + 三一四一 "
var_dump(file_get_contents($merge_file));
// string(180) " 我本有为野客,飘飘浪迹世间。// 一时被命住名山。未免随机应变。// 识破尘劳扰扰,何如乐取安闲。一
// 流霞细酌咏诗篇。且与白云为伴。"echo"File Patch: ", PHP_EOL;
var_dump(xdiff_file_patch($old_file, $diff_file, $patch_file, XDIFF_PATCH_NORMAL)); // bool(true)
var_dump(file_get_contents($patch_file));
// string(180) " 我本有为野客,飘飘浪迹世间。// 一时被命住名山。未免随机应变。// 识破尘劳扰扰,何如乐取安闲。一
// 流霞细酌咏诗篇。且与白云为伴。"echo"File Binary Diff: ", PHP_EOL;
$patchBinary = xdiff_file_bdiff($old_file, $new_file, $diff_file);
var_dump($patchBinary); // bool(true)
var_dump(file_get_contents($diff_file));
// string(44) "�{�N��一
//     流霞细酌�!"

var_dump(xdiff_file_bdiff_size($diff_file)); // int(180)
var_dump(xdiff_file_bpatch($old_file,$patchBinary, $patch_file)); // bool(false)
var_dump(file_get_contents($patch_file));
// string(180) " 我本有为野客,飘飘浪迹世间。// 一时被命住名山。未免随机应变。// 识破尘劳扰扰,何如乐取安闲。一
// 流霞细酌咏诗篇。且与白云为伴。"echo"File RA Binary Diff: ", PHP_EOL;
$raPatchBinary = xdiff_file_rabdiff($old_file, $new_file1, $diff_file);
var_dump($raPatchBinary); // bool(true)
var_dump(file_get_contents($diff_file));
// string(46) "�{�N�X 二 XY
// 三一四一 "

var_dump(xdiff_file_bdiff_size($diff_file)); // int(193)
var_dump(xdiff_file_bpatch($old_file, $raPatchBinary, $patch_file)); // bool(false)
var_dump(file_get_contents($patch_file));
// string(193) " 我本有为野客,飘飘浪迹世间。// 一时被命住名山。未免随机应变。二
// 识破尘劳扰扰,何如乐取安闲。// 流霞细酌咏诗篇。且与白云为伴。// 三一四一 "

这里咱们就不一一解说了,这些函数的操作和性能与字符串操作的相干函数都是相似的,只是参数略有不同。比方它们在比照或者合并、补丁之后都会生成一个文件,所有函数的参数都是以文件为根底的。大家能够自行运行一下测试代码并参考官网文档进行学习。

总结

对于这个 xdiff 扩大其实咱们应用得并不多,不过已经看过有一套开源的应用 PHP 来做的 CMS 零碎中治理前端模板页面的性能中就应用到了这一套扩大。任何工具的存在都有它的意义,或者你在为某个性能而苦恼的时候正好就看到了这篇文章,从而轻松地解决了手头上的问题也说不准,理解并有个大略的印象,在工作中才不至于摸瞎,这就是咱们刷文档的意义。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/10.PHP 中的文件比照扩大.php

参考文档:

https://www.php.net/manual/zh/book.xdiff.php

https://directory.fsf.org/wiki/LibXDiff

各自媒体平台均可搜寻【硬核项目经理】

退出移动版