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 做一个接收 结果的接口并处理返回的结果就好了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nengzhen_chen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值