【发布时间】:2025-11-21 19:50:02
【问题描述】:
我在生产服务器上使用 php 5.2.9,似乎 exec() 函数的行为“非标准”。
如果我运行exec("ls", $output, $return_var),那么$output 将按预期包含当前文件夹中的文件列表,但$return_var 将按预期设置为-1 而不是0。
我正在使用$return_var 来确定命令成功完成的位置,并且在所有其他经过测试的服务器上都按预期工作:)
有人遇到过这样的情况吗?
编辑:
<?php
$command = "asd";
$t1 = time();
$output = Array();
$result = -5;
$r = exec($command, $output, $result);
$t2 = time();
echo "<pre>";
var_export(Array(
'command'=>$command,
'result'=>$result,
'output'=>implode("\n", $output),
'r'=>$r,
't2-t1'=>$t2-$t1,
));
echo "</pre>";
无论我在$command、$result 中输入什么命令,都将始终为-1,即使对于不存在的命令也是如此……这很奇怪
【问题讨论】:
-
如果您的
$command变量是一个空字符串而exec()没有给ls提供任何参数怎么办?退出码还是-1吗?如果是这样,您是否使用man ls为当前系统检查了ls的实现,以查看是否定义了退出代码-1?其他命令也是这样吗(可能是du -h index.html)? -
我唯一能看到的是这个post on the exec php manual page,但由于它在其他服务器上工作,所以不清楚为什么会这样。
-
我看过那个评论,我没有在 php.ini 中使用这些信号。 php 也不是用 --enable-sigchld 编译的,这可能会导致同样的问题(为 php 4.0.. 找到错误)
-
这很奇怪,我认为 UNIX 样式的退出代码是用无符号字节完成的,因此值在 0 到 255 之间。
-
@R.Bemrose:是的,返回码应该是我所知道的正整数。 -1 不是其中之一。 @Mark B:已经检查过了。请检查 cmets