exec 获取执行结果及不等待exe执行完处理方案(亲测有效)

本文详细介绍了PHP中的exec函数如何获取命令执行结果,特别是在执行exe程序时的情况。当指定output参数时,exec会将结果填充到数组中。成功执行返回0,否则可能是错误或失败。通过示例代码展示了如何处理中文乱码,并提供了一个不等待exe执行完的解决方案,即通过两个exe程序互相配合,快速通知PHP程序可以继续执行下一步。

php中exec返回什么内容?

相关的资料定义

在PHP中,exec()函数返回命令执行结果的最后一行内容。该函数用于执行一个外部程序,当指定函数的output参数时,会使用返回结果填充output,若output参数中已经有了元素,exec函数会在output后面追加。

但这个怎么去理解呢?

exec() 默认情况会返回指定命令结果的最后一行,指定output参数,会使用返回结果填充output;如果output参数中已经有元素,exec()会在output后面追加。

exec(执行的程序, 程序执行完返回的结果, 程序执行成功或失败或错误信息);

$return,返回 1,表示运行成功

返回 0,表示运行程序失败

返回 负数,表示程序运行过程出现错误,程序本身有问题。

成功例子(以下代码是本人亲测有效的,还有不等待exe执行完怎么处理的方案):

test.php

 <?php  

       $exe ="ping www.baidu.com";//这里可以换成你要调用的程序路径

        //比如: $exe = "C:\\a.exe";//exe程序本身需要做把程序的执行结果返回,如果程序没做,可以执行代码测试一下返回的内容是什么,如果是空,那就说明你需要exe程序要做执行完的返回结果。

        // $exe .= " 2>&1 &";//不等待结果,但实际用的时候,很多时候还是会等待

        //当你在执行之前设置了$out

        //$out = array('111111');//在最后输出的数组里第一个就会是 0=>11111 在输出的数组的最前面

        exec($exe,$out, $return);

        if($return== 0 )//调用成功

        {

            $out_new = array();

            foreach($out as $k=>$v)

            {

   

                $out_new[$k]=iconv("gb2312","utf-8",$v);//这里是处理返回的数组中,中文乱码的将字符串的编码从GB2312转到UTF-8

               // $out_new[$k]=iconv("utf-8","gb2312",$v);//将字符串的编码从UTF-8转到GB2312

            }

            dump($out_new);

        }

        else//调用失败

        {

            return 0;

        }

成功时,输出的结果会如下

array(11) {
  [0] => string(0) ""
  [1] => string(73) "正在 Ping www.a.shifen.com [163.177.151.109] 具有 32 字节的数据:"
  [2] => string(62) "来自 163.177.151.109 的回复: 字节=32 时间=13ms TTL=55"
  [3] => string(62) "来自 163.177.151.109 的回复: 字节=32 时间=13ms TTL=55"
  [4] => string(62) "来自 163.177.151.109 的回复: 字节=32 时间=14ms TTL=55"
  [5] => string(62) "来自 163.177.151.109 的回复: 字节=32 时间=14ms TTL=55"
  [6] => string(0) ""
  [7] => string(38) "163.177.151.109 的 Ping 统计信息:"
  [8] => string(72) "    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),"
  [9] => string(48) "往返行程的估计时间(以毫秒为单位):"
  [10] => string(49) "    最短 = 13ms,最长 = 14ms,平均 = 13ms"
}

如果在最开始定了 $out = array('111111'),输出的结果会如下

array(12) {
  [0] => string(6) "111111"
  [1] => string(0) ""
  [2] => string(73) "正在 Ping www.a.shifen.com [163.177.151.110] 具有 32 字节的数据:"
  [3] => string(62) "来自 163.177.151.110 的回复: 字节=32 时间=20ms TTL=55"
  [4] => string(62) "来自 163.177.151.110 的回复: 字节=32 时间=20ms TTL=55"
  [5] => string(62) "来自 163.177.151.110 的回复: 字节=32 时间=20ms TTL=55"
  [6] => string(62) "来自 163.177.151.110 的回复: 字节=32 时间=20ms TTL=55"
  [7] => string(0) ""
  [8] => string(38) "163.177.151.110 的 Ping 统计信息:"
  [9] => string(72) "    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),"
  [10] => string(48) "往返行程的估计时间(以毫秒为单位):"
  [11] => string(49) "    最短 = 20ms,最长 = 20ms,平均 = 20ms"
}

另外,如果想php不等待exe程序执完,就返回进行php程序的下一步

我的成功方案是:

做两个 exe程序。

1.exe:用作调 2.exe程序

2.exe: 是你需要运行很久的 exe程序,”2.exe“ 程序成功被调用时,要立即告诉  1.exe 程序已成功调,然后  1.exe 程序 获取到成功调用的信息立马结束 1.exe 线程或关闭,这样php程序就可以很快知道  2.exe 已被成功调用,可以继续执行php代码的下一步操作了

3.如果想要 获取 最终 2.exe返回的结果,这个就要php 做一个接收 结果的接口并处理返回的结果就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nengzhen_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值