Использование diff в Linux с использованием exec-функции php - PullRequest
1 голос
/ 15 декабря 2010

Мне нужно сравнить 2 xml-файла и сгенерировать патч, используя php и команду diff Linux. Вот мой код:

<?php

// script file location: /var/local/out/upload.php
// ...

// $templateName file location: /var/local/out/upload/example_word_template/word/document.xml
// $filename file location: /var/local/out/upload/example_word/word/document.xml

// $templateName value: upload/example_word_template/word/document.xml
// $filename value: upload/example_word/word/document.xml

$command = "diff /var/local/out/$templateName /var/local/out/$filename > /var/local/out/patch.patch";
exec($command);
echo($command);

?>

Браузер выводит:

diff /var/local/out/upload/example_word_template/word/document.xml /var/local/out/upload/example_word/word/document.xml> /var/local/out/patch.patch

Если я скопирую и вставлю вывод и выполню его непосредственно в Linux, он будет работать нормально. Но сам скрипт не будет генерировать файл патча. Что может быть не так?

Ответы [ 3 ]

5 голосов
/ 15 декабря 2010

PHP имеет расширение PECL для xdiff , которое вы можете попробовать вместо этого.

Пример из руководства для xdiff_file_diff

$old_version = 'my_script.php';
$new_version = 'my_new_script.php';

xdiff_file_diff($old_version, $new_version, 'my_script.diff', 2);

Обратите внимание, что diff находится только на синтаксическом уровне, хотя семантически нет никакой разницы между

<element foo="foo" bar="bar"/>

и

<element 
    foo="foo"
    bar="bar"/>
2 голосов
/ 15 декабря 2010

Вы хотите захватить вывод, например, так ...

$command = "diff /var/local/out/$templateName /var/local/out/$filename > /var/local/out/patch.patch";
exec($command, $output);

var_dump($output);

Вы можете заново собрать линии, например, так ...

echo join("\n", $output);
2 голосов
/ 15 декабря 2010

Попробуйте проверить вывод выполненной команды, возможно, пользователь, под которым вы запускаете apache, не имеет разрешения на запись в эту папку или еще что-то ...:

$output=array();$status=0;
exec($command,$output,$status);
var_dump($output);var_dump($status);
...