为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?

Posted

技术标签:

【中文标题】为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?【英文标题】:Why does this PHP script with a shell_exec call run from the command line in Windows 10, but not the browser/localhost?为什么这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机? 【发布时间】:2021-09-30 16:52:07 【问题描述】:

我在 Windows 10 上使用 XAMPP,并尝试运行一个简单的 php 脚本,该脚本使用 shell_exec 函数在同一目录中调用一个简单的 R 脚本。这是 PHP index.php 文件:

<?php

    echo shell_exec('Rscript test.R');

这是test.R 文件:

print("Hello, World!")

从命令行(即 Windows 的 Git),当我在文件夹中运行 php index.php 时,我得到以下输出:

[1] "Hello, World!"

但是,当我通过 XAMPP 和 localhost 从 Web 浏览器运行 index.php 时,我在页面上看不到任何内容。起初,我认为这可能是权限问题,因此我授予文件夹上所有用户的完全控制访问权限,但似乎没有任何改变。

关于如何从浏览器中获得此功能的任何想法?谢谢。

【问题讨论】:

我会亲自查看 PHP 日志文件,看看是否有错误。您也可以显示它们(参见stackify.com/display-php-errors)。可能 shell_exec 在 Apache 的 PHP INI 中被禁用。它也可能与“安全模式”有关。我相信你可以在论坛上找到答案。祝你好运! Patrick,非常感谢您的评论并为我指明了方向。不幸的是,我不确定这些都是问题所在。我查看了php.ini 文件,没有为disable_functions 指令列出任何内容,并且在任何地方都没有提到shell_exec。此外,我将链接文章中推荐的三个错误报告行添加到我的 PHP 脚本中,但没有显示任何内容。最后,看起来 PHP 中的“安全模式”在 5.4 中被禁用,而我使用的是 PHP 7.4 (php.adamharvey.name/manual/en/features.safe-mode.php)。还有其他想法吗?谢谢。 【参考方案1】:

找到了我遇到的问题的答案。显然,即使 Rscript 是我的 Windows 10 PATH 变量的一部分,当我尝试在 PHP 中通过 shell_exec 执行 R 脚本时,我必须拥有 Rscript 可执行文件的完整路径(我猜是因为 PHP脚本/Apache 服务器不知道路径变量)。

我更改了shell_exec 函数调用如下,它起作用了:

echo shell_exec('"C:\Program Files\R\R-4.1.0\bin\Rscript" test.R');

这是帮助我解决这个问题的 SO 帖子的链接:

shell_exec does not execute from browser requests

【讨论】:

以上是关于为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中调用 Python 并获取运行结果

从PHP执行PhantomJS

OpenCV exec 的 PHP shell_exec 问题(MAMP 库错误)

PHP shell_exec 等待脚本完成? [复制]

PHP执行系统外部命令函数:exec()passthru()system()shell_exec()

通过浏览器从 php 脚本调用 svn update 不起作用