2010-12-15 3 views
1

Ich muss 2 XML-Dateien vergleichen und generieren einen Patch mit PHP und Linux Diff-Befehl. Hier ist mein Code:Verwenden von Diff in Linux mit PHP exec-Funktion

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

?> 

Die Browser-Ausgänge:

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

Wenn ich die Ausgabe kopiere und einfüge und sie direkt in Linux ausführe, läuft sie gut. Aber das Skript selbst wird die Patch-Datei nicht erzeugen. Was könnte falsch sein?

Antwort

2

ist Versuchen überprüft die Ausgabe des ausgeführten Befehls, vielleicht der Benutzer, den Sie apache u nder ist nicht berechtigt, in diesem Ordner oder so was zu schreiben ...:

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

Die Ausgabe war "array (0) {} int (1)" –

+0

@wilsonsilva Es gab einen Fehler. – alex

+1

Ich denke, es ist Operation nicht erlaubt :) http://www.pegasoft.ca/resources/boblap/99_b.html – Catalin

5

PHP hat eine PECL extension for xdiff möchten Sie vielleicht stattdessen versuchen.

Beispiel aus Handbuch für 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); 

Beachten Sie, dass diff auf der syntaktischen Ebene ist nur, während semantisch es keinen Unterschied zwischen

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

und

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

+1, weil ich etwas neues :) gelernt – alex

+1

@ Alex Also habe ich heute :) – Zuul

2

Sie möchten die Ausgabe erfassen, wie so ...

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

var_dump($output); 

Sie die Linien wie so wieder zusammenbauen können.

..
echo join("\n", $output); 
+0

Die Ausgabe war "Array (0) {}", ich habe keine Ahnung, was es bedeutet. Ich bin immer noch ein Linux-Neuling. –

+1

@wilsonsilva Von Ihrem anderen Kommentar sagten Sie, dass der zurückgegebene Status '1' war. Dies bedeutet, dass ein Fehler aufgetreten ist. Zeigen Ihre Pfade auf Dateien, die existieren? – alex

+0

Ja. Wenn ich den folgenden Befehl direkt in Linux ausführe: "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 "Die Datei patch.patch wird erstellt. –