优化判断机制

This commit is contained in:
augushong
2024-06-01 10:27:39 +08:00
parent 6f6bc56d75
commit aedb332f3d

View File

@@ -132,55 +132,74 @@ class PathToolsBase
$result = true;
// Check if filesize is different
if (filesize($a) !== filesize($b)) {
$result = false;
}
// 如果前面的方法认为文件变化,那么以文本变化的方式识别是否变化,并给出变化的内容
$text_mime_type = [];
$text_mime_type[] = 'text/html';
$text_mime_type[] = 'text/plain';
$text_mime_type[] = 'text/css';
$text_mime_type[] = 'image/svg+xml';
$text_mime_type[] = 'text/x-php';
$text_mime_type[] = 'application/json';
$text_mime_type[] = 'application/x-wine-extension-ini';
if ($result) {
// Check if content is different
$ah = fopen($a, 'rb');
$bh = fopen($b, 'rb');
if (in_array(mime_content_type($a), $text_mime_type) && in_array(mime_content_type($b), $text_mime_type)) {
$a_content = file_get_contents($a);
$b_content = file_get_contents($b);
while (!feof($ah)) {
if (fread($ah, 8192) != fread($bh, 8192)) {
$result = false;
break;
$a_content = str_replace("\r\n", "\n", $a_content);
$b_content = str_replace("\r\n", "\n", $b_content);
// 将空格和制表符转换为一个空格
$a_content = preg_replace('/[ \t]+/', ' ', $a_content);
$b_content = preg_replace('/[ \t]+/', ' ', $b_content);
$a_content_arr = mb_str_split($a_content);
$b_content_arr = mb_str_split($b_content);
$a_content_length = count($a_content_arr);
$diff_content = [];
for ($i = 0; $i < $a_content_length; $i++) {
$diff_char = [];
$diff_char['path_a'] = $a;
$diff_char['path_b'] = $b;
$diff_char['index'] = $i;
if (isset($b_content_arr[$i])) {
if ($a_content_arr[$i] !== $b_content_arr[$i]) {
$diff_char['a'] = $a_content_arr[$i];
$diff_char['b'] = $b_content_arr[$i];
$diff_content[] = $diff_char;
}
} else {
$diff_char['a'] = $a_content_arr[$i];
$diff_char['b'] = '';
$diff_content[] = $diff_char;
}
}
fclose($ah);
fclose($bh);
}
if (count($diff_content) > 0) {
$result = false;
}
} else {
// Check if filesize is different
if (filesize($a) !== filesize($b)) {
$result = false;
}
if (!$result) {
// 如果前面的方法认为文件变化,那么以文本变化的方式识别是否变化,并给出变化的内容
$text_mime_type = [];
$text_mime_type[] = 'text/html';
$text_mime_type[] = 'text/plain';
$text_mime_type[] = 'text/css';
$text_mime_type[] = 'image/svg+xml';
$text_mime_type[] = 'text/x-php';
$text_mime_type[] = 'application/json';
$text_mime_type[] = 'application/x-wine-extension-ini';
if ($result) {
// Check if content is different
$ah = fopen($a, 'rb');
$bh = fopen($b, 'rb');
if (in_array(mime_content_type($a), $text_mime_type) && in_array(mime_content_type($b), $text_mime_type)) {
$a_content = file_get_contents($a);
$b_content = file_get_contents($b);
$a_content_length = strlen($a_content);
$b_content_length = strlen($b_content);
if ($a_content_length !== $b_content_length) {
$result = false;
} else {
for ($i = 0; $i < $a_content_length; $i++) {
if ($a_content[$i] !== $b_content[$i]) {
$result = false;
break;
}
while (!feof($ah)) {
if (fread($ah, 8192) != fread($bh, 8192)) {
$result = false;
break;
}
}
fclose($ah);
fclose($bh);
}
}