【问题标题】:Executing linux commands with PHP用 PHP 执行 linux 命令
【发布时间】:2010-10-04 22:55:36
【问题描述】:

我正在尝试通过 PHP 命令行脚本执行 linux 命令,使用 exec 命令没有问题。

问题是,如果出现错误(例如用户/密码不正确),我正在执行的命令 (mysqldump) 会输出错误消息。我似乎无法捕获此错误以记录它。它只是将这个错误打印到屏幕上。

如何使这个错误不被打印到屏幕上,而是将它放在一个变量中以便在我的脚本中使用?

谢谢!

【问题讨论】:

    标签: php shell scripting


    【解决方案1】:

    您看过system() 命令吗?自从我做任何 PHP 以来已经有一段时间了,但这敲响了警钟。

    【讨论】:

      【解决方案2】:

      尝试使用反引号?

      $var = `命令`;

      【讨论】:

        【解决方案3】:

        我对 Unix 不太感兴趣(新年决议...),但这些函数看起来很有帮助:

        • shell_exec - 以字符串形式返回结果。
        • passthru - 看起来你可以像这样执行:passthru('command', $result);,然后使用$result

        【讨论】:

          【解决方案4】:
          exec("mysqldump -u user -p passwod database >  outputfile.sql 2> error.log");
          

          【讨论】:

            【解决方案5】:

            你需要redirect stderr to stdout,这样你才能捕获它。此示例将 stdout 路由到 devnull(因此忽略它)并将 stderr 路由给您:

            exec('ls * 2>&1 1>/dev/null');
            

            【讨论】:

            • 别忘了清理任何用户输入! escapeshellarg、escapeshellcmd 等
            【解决方案6】:

            以下将stderr消息路由到与正常输出相同的位置。

            exec("mysql_dump blah 2>&1",$output,$return_val)
            if($return_val !== 0) 
            echo "there was an error"
            

            2>&1 表示将 stderr 消息重新路由到与 stdout 相同的位置,因此将被加载到输出数组中。

            【讨论】:

              【解决方案7】:

              使用popen 运行进程。此页面上的示例 #2 正是您要查找的内容:

              <?php
              error_reporting(E_ALL);
              
              /* Add redirection so we can get stderr. */
              $handle = popen('/path/to/spooge 2>&1', 'r');
              echo "'$handle'; " . gettype($handle) . "\n";
              $read = fread($handle, 2096);
              echo $read;
              pclose($handle);
              ?>
              

              【讨论】:

              • @edanb:这是一个足够好的解决方案。但是我不是 bash 的粉丝,所以如果你愿意花更多的时间来处理错误,我推荐 proc_open。
              猜你喜欢
              • 1970-01-01
              • 2018-11-21
              • 1970-01-01
              • 2023-03-06
              • 2017-12-13
              • 1970-01-01
              • 2021-08-19
              • 2012-04-17
              • 1970-01-01
              相关资源
              最近更新 更多