gpt4 book ai didi

php - exec 总是返回 -1(或 127)

转载 作者:IT王子 更新时间:2023-10-28 23:55:43 28 4
gpt4 key购买 nike

我在生产服务器上使用 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,即使对于不存在的命令也是如此......这很奇怪

最佳答案

假设返回 $result == -1 的系统是基于类 Unix 的(我不知道使用相同代码的 Windows 会如何表现)

PHP (5.2.9) exec() 函数不调用 C exec() 原语(如果它不能替换/执行进程,则返回 -1,这里不是这种情况)。相反,它会调用创建管道的 popen()、执行 fork() 并使用您的命令执行 shell。return_value -1 不是 C 原语的直接结果,而是由 PHP 内部构建的,具体取决于命令的处理方式。换句话说,“ls”命令可能执行得很好,而例如 PHP 无法正确关闭管道。

查看 C 代码,在 ext/standard/exec.c 中,返回码为 -1 的原因可能有两个,由错误触发;第二个发生在 popen() 调用之后

  fp = VCWD_POPEN(cmd_p, "r");

if (!fp) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to fork [%s]", cmd);
goto err;
}
// ...
err:

pclose_return = -1;
goto done;

但是在这种情况下,您不会看到结果,并且日志会显示错误。

稍后,通过该行设置 return_value

  pclose_return = php_stream_close(stream);

查看 _php_stream_free()(php_stream_close() 是用 _php_stream_free() 替换的宏),最有可能返回 -1 的候选者是

  ret = stream->ops->close(stream, preserve_handle ? 0 : 1 TSRMLS_CC);

这又间接调用了 C 原语 pclose()。根据手册

The pclose() function returns -1 if wait4(2) returns an error, or some other error is detected.

似乎在管道关闭期间检测到错误,但不会阻止设置结果数据。要严格查找原因,需要检查操作系统设置和日志、PHP配置和编译参数。

我会推荐

  • 为您的操作系统应用补丁,并可能更新到更新的版本(如果适用),
  • 将 PHP 更新到 5.3.3(目前最新),因为 PHP exec() 代码发生了重大变化。

请注意,5.3 版本中与 PHP suhosin 模块相关的更改默认情况下增强了运行 PHP 文件时的安全性。

关于php - exec 总是返回 -1(或 127),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3459270/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com