【问题标题】:PHP System Call Always FailsPHP 系统调用总是失败
【发布时间】:2023-03-31 11:24:01
【问题描述】:

(看似)无论我尝试使用 PHP 的 system 函数运行什么命令,该命令总是什么都不做,然后以退出代码 1 失败。例如,

system("echo 'this should definitely work'", $retval);

设置$retval = 1。也一样

system("dir", $retval);

以及运行我编写的可执行文件;当我跑步时

vfmt -h cat.v

来自cmd.exe,该命令有效并返回退出代码 0,但正在运行

system("vfmt -h cat.v", $retval);

再次设置$retval = 1。此vfmt.exe 文件与尝试这些system 调用的src.php 脚本位于同一目录中。

我几乎无计可施,试图找出问题所在。什么可能导致此问题?

【问题讨论】:

  • 您应该在问题中包含有关您的环境的信息,例如:什么服务器,您如何运行 php(例如服务器加载或 php-cgi)等等......以及错误中的一些行-log-file ...否则,所有答案都只会“猜测”-我的下面这样。
  • 在命令末尾添加 2>&1 以将错误从 stderr 重定向到 stdout。这应该清楚出了什么问题。见stackoverflow.com/questions/538939/…
  • 尝试添加vfmt.exe的路径,例如:system("c:\\path_to_exe\\vfmt.exe -h cat.v", $retval);
  • 您是否遗漏了原始脚本中的引号,或者只是提出的问题?
  • @beroe 只是提出的问题......对不起,我会解决它。

标签: php shell cmd


【解决方案1】:

您需要重定向您正在使用 system() 运行的命令的输出,以便它在后台运行。否则,PHP 将等待程序执行结束后再继续。

system('mycommand.exe > output.log', $retval);
system('mycommand.exe 2>&1', $retval);

不确定您是如何调用脚本的,但您可能遇到了 PHP max_execution_time(或相关)限制。有什么要调查的。此外,由于您在 Windows 上运行,因此在执行系统调用时可能需要在命令中使用绝对路径,因为您正在调用的文件可能不在任何定义的 PATH 中。

【讨论】:

    【解决方案2】:

    最可能的问题是“工作目录”不是您所期望的。

    这是隐藏的,因为您正在检查返回值而不是屏幕输出;它们是不同的。

    首先,监控:尝试使用exechttp://au2.php.net/manual/en/function.exec.php,因为这将通过提供屏幕输出和返回值来帮助您进行调试。

    其次,修复:

    1 - 指定可执行文件和包含文件的完整路径。假设这是 Windows(你指的是 cmd.exe)然后运行

    system("c:\PathToPhpFile\vfmt -h c:\PathToCatVFile\cat.v, $retval);
    

    2 - 在调用system()exec() 之前更改工作目录,首先使用chdir()

    (或者您可以在批处理文件(Windows)中执行 cd 或在 Linux 中连接命令;但这不太便携。)

    【讨论】:

      【解决方案3】:

      您应该检查您的php.ini 是否有下一行:

      disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
                         ^^^^          ^^^^^^^^^^^^^^^^^^
      

      等等。

      还要检查你的“安全模式”状态,(php ver. safe_mode_exec_dir内的文件等等......

      更多信息in the doc 和执行命令here 尤其是系统here

      【讨论】:

      • 我的php.inidisable_functions=,并且没有与“安全模式”有关的行。不幸的是,这不是问题所在。
      • php.ini 有时有两个,一个用于命令行界面,一个用于 apache。 /etc/php/7.4/apache2/php.ini 或 sudo vi /etc/php/7.4/cli/php.ini。确保您修改的是正确的。当然你需要重启 apache。
      【解决方案4】:

      echo 总是一个 shell 内部命令,而不是一个单独的可执行文件。你需要更多类似的东西

      system('/bin/sh -c "echo \'foo\'"'); // unix-ish
      system('cmd.exe /c echo foo'); // windoze
      

      【讨论】:

      • 感谢您的评论,但使用cmd.exe -c vfmt -h cat.v 仍然不起作用...
      • 哎呀。对不起。这是/c
      • ...cmd.exe /c vfmt -h cat.v 也没有。还有其他想法吗?
      • vfmt 不需要 cmd 的东西,因为它是一个可执行文件。试试exec('vfmt ...', $output, $ret); var_dump($output)
      • 我就是这么想的。所以这又回到了我的问题“为什么 vfmt -h cat.v 在 PHP system 调用中不能在 cmd.exe 中工作?
      猜你喜欢
      • 2020-06-08
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多