【问题标题】:Using diff in Linux using php's exec function使用 php 的 exec 函数在 Linux 中使用 diff
【发布时间】:2010-12-15 11:15:08
【问题描述】:

我必须比较 2 个 xml 文件并使用 php 和 Linux 的 diff 命令生成补丁。这是我的代码:

<?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 中执行它,它运行得很好。但脚本本身不会生成补丁文件。有什么问题?

【问题讨论】:

    标签: php linux diff compare exec


    【解决方案1】:

    PHP 有一个 PECL extension for 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);
    

    请注意,差异仅在句法级别上,而在语义上没有区别

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

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

    【讨论】:

      【解决方案2】:

      尝试检查执行命令的输出,也许您正在运行 apache 的用户没有权限写入该文件夹或其他...:

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

      【讨论】:

      • 输出为“array(0) { } int(1)”
      • 我认为这是不允许的操作:) pegasoft.ca/resources/boblap/99_b.html
      • 目标目录不存在,不可写或“diff”编未找到/不可执行。
      • @symcbean 不能是“'diff' prog 未找到/不可执行。”因为他说它在控制台中工作...@wilsonsilva您是否尝试过在执行命令之前手动创建输出文件? file_put_contents('/var/local/out/patch.patch','');chmod('/var/local/out/patch.patch',0777); 之类的东西?
      • 不是真的..它应该已经创建了文件 :) 进行测试,尝试从命令行将 /var/local/out 的权限更改为 0777 并重试 :)
      【解决方案3】:

      你想像这样捕获输出......

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

      【讨论】:

      • 输出是“array(0) { }”,我不知道它是什么意思。我还是个 Linux 新手。
      • @wilsonsilva 在您的其他评论中,您说返回的状态是1。这意味着出现了错误。您的路径是否指向存在的文件?
      • 是的。如果我直接在linux中执行以下命令:“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" 补丁.patch 文件被创建。
      • @wilsonsilva 您想将该文件读入 PHP 吗?尝试使用file_get_contents()
      • 我无法读取它,因为如果我使用 php 脚本则不会创建文件。
      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 2012-06-07
      相关资源
      最近更新 更多