【问题标题】:Checking exec() runs successfully or not检查 exec() 是否成功运行
【发布时间】:2012-08-06 05:31:30
【问题描述】:

我一直试图让知道 php 中的 exec() 命令是否成功执行,以便我可以相应地回显某些消息。 我尝试了以下代码,但问题在于 exec() 是否成功运行,它总是 echo "PDF not created" 并且永远不会成功创建 echo pdf。请让我知道如何检查 exec() 的执行情况,以便我可以相应地回显消息 谢谢,

<?php
if (exec('C://abc//wkhtmltopdf home.html sample.pdf'))
echo "PDF Created Successfully";
else
echo "PDF not created";
?>

【问题讨论】:

  • 为什么不直接检查创建的文件是否有效?
  • 您是否检查过您的系统中是否启用了exec()
  • Exec 返回输出的最后一行,在 PHP 中必须等于 true。
  • @dqlopez 显然因为它给了我输出所以它启用了。

标签: php exec


【解决方案1】:

根据PHP的exec quickref,可以传入指针来获取命令的输出和状态。

<?php
exec('C://abc//wkhtmltopdf home.html sample.pdf', $output, $return);

// Return will return non-zero upon an error
if (!$return) {
    echo "PDF Created Successfully";
} else {
    echo "PDF not created";
}
?>

如果你想列举可能的错误,你可以在hiteksoftware找到代码

【讨论】:

  • 长脚本呢?如何修改代码以使其能够在 exec 中运行长 python 脚本?
  • $return 如果 exec 未能完成,也可以为 null,例如命令执行期间磁盘空间不足。因此,这不是万无一失的解决方案,请参阅我的答案以获得更好的解决方案。
  • 我创建了一个 home.html 文件并将您的代码写入 index.php 文件然后在浏览器中运行,它对我不起作用。
【解决方案2】:

一个简单的例子:

$ip = "192.168.0.2";
$exec = exec( "ping -c 3 -s 64 -t 64 ".$ip, $output, $return );
echo $exec;
echo "<br />----------------<br />";
print_r( $output );
echo "<br />----------------<br />";
print_r( $return );

在不 ping 或 ERROR 的情况下。 (一)

----------------
Array ( [0] => PING 192.168.0.2 (192.168.0.2) 64(92) bytes of data. [1] => [2] => --- 192.168.0.2 ping statistics --- [3] => 3 packets transmitted, 0 received, 100% packet loss, time 2016ms [4] => )
----------------
1

如果成功(零)

rtt min/avg/max/mdev = 4.727/18.262/35.896/13.050 ms
----------------
Array ( [0] => PING 192.168.0.2 (192.168.0.2) 64(92) bytes of data. [1] => 72 bytes from 192.168.0.2: icmp_req=1 ttl=63 time=14.1 ms [2] => 72 bytes from 192.168.0.2: icmp_req=2 ttl=63 time=35.8 ms [3] => 72 bytes from 192.168.0.2: icmp_req=3 ttl=63 time=4.72 ms [4] => [5] => --- 192.168.0.2 ping statistics --- [6] => 3 packets transmitted, 3 received, 0% packet loss, time 2003ms [7] => rtt min/avg/max/mdev = 4.727/18.262/35.896/13.050 ms )
----------------
0

【讨论】:

    【解决方案3】:

    正确的方法是检查 $return_var 没有设置为零,因为它只有在成功时才设置为零。在某些情况下,exec 可能会失败,并且 return_var 未设置为任何值。例如。如果服务器在执行过程中磁盘空间不足。

    <?php
    exec('C://abc//wkhtmltopdf home.html sample.pdf', $output, $return_var);
    if($return_var !== 0){ // exec is successful only if the $return_var was set to 0. !== means equal and identical, that is it is an integer and it also is zero.
        echo "PDF not created";
    }
    else{
        echo "PDF Created Successfully";
    }
    
    ?>
    

    注意:不要将 $return_var 初始化为零

    【讨论】:

    • 哪里提到$return_var如果成功应该设置为0?
    • "执行命令的返回状态将被写入这个变量"php.net/manual/en/function.exec.php 所以如果没有返回状态是因为命令甚至没有完成,那么它不会被设置为任何事物。这就是最好检查它是否设置为 0 而不是其他方式的原因。
    • 哦,我明白你的意思了,“子进程向父进程返回零表示成功的常见编程实践”:en.wikipedia.org/wiki/Exit_status
    • 进程可以返回他们喜欢的任何东西,但惯例是使用零表示成功,所以大多数时候都是这样,如果您使用任何标准工具,肯定会这样。
    • $output 包含什么?
    【解决方案4】:

    我为我工作

    适用于系统 linux 和 lang:php,laravel

    exec('/usr/bin/tesseract 2.png out1 -l '.$lang,$output,$error);
               return (!$error)? "success":"Error";
    

    【讨论】:

      【解决方案5】:

      如果您不关心返回码,我建议使用下一种方法:

      private function execCommand($command) {
          exec($command, $output, $return);
      
          return $return === 0;
      }
      

      然后简单地这样称呼它:

      if ($this->execCommand("C://abc//wkhtmltopdf home.html sample.pdf")) {
          echo "Success";
      } else {
          echo "Error";
      }
      

      【讨论】:

        猜你喜欢
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多