php shell_exec和exec()命令在我的本地主机Ubuntu 20.04中的Linux Ubuntu上不起作用

xxhby3vn  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(152)

下面的代码只在我的终端工作,但它不工作在我的localhost xampp Linux Unbuntu 20.04,shell_exec()和exec()都不工作。当我转到localhot时,它执行所有代码,但不执行它的两个函数。以下代码不执行。

// Add the --enable-local-file-access option to enable access to local files (HTML)
$wkhtmltopdfCommand = "wkhtmltopdf --enable-local-file-access {$outputHtmlPath} {$pdfOutputPath}";
shell_exec($wkhtmltopdfCommand);

我不知道我是否需要做些改变,但我需要一些建议。

lp0sw83n

lp0sw83n1#

1)检查安全设置

您是否检查并比较了Web和CLI之间的php.ini设置?
在脚本中,在开头添加以下内容:

phpinfo();
die();

运行页面并检查执行时应用的设置。您还将看到加载了哪些php.ini文件。
问题是shell_exec()exec()可能出于安全原因而被禁用。这可以通过编辑PHP的 disable_functions 选项来更改。
INI设置通常存储在/etc/php/*目录下的特定*.ini文件中。所以你必须在那里寻找一些设置。你会发现一些 PHPc命令linei接口的INI设置(可能是/etc/php/8.2/cli/php.ini)和一些其他的web服务器设置。这取决于 PHP 是如何从您的Web服务器上运行的。在我的例子中,我正在运行一个 NGINX 服务器,它在 FPM 上运行 PHP。因此,在这种情况下,INI文件是/etc/php/8.2/fpm/php.ini。但是你也可以使用 CGIApache 模块运行 PHP。这就是为什么你应该在我建议的phpinfo()调用的帮助下检查哪个INI文件被加载了。
我的/etc/php/8.2/cli/php.ini文件将disable_functions设置为空字符串,这意味着在命令行中没有限制。但是在我的 FPM 设置中,我有一个巨大的关键功能列表,这些功能被禁用以降低我的服务器被黑客攻击的风险。如果我将shell_exec添加到禁用函数列表中,则无法从Web服务器调用它。这可能是你的情况。
Apache configuration can also set some PHP settings,仅用于特定的虚拟主机。所以如果你在php.ini文件中找不到什么东西的话,可以看看它们。
根据您的PHP设置,如果安装了 Suhosin 加固模块,您可能还需要检查safe_mode和suhosin.executor.*。

2)使用二进制文件的完整路径

当从Web服务器运行shell_exec()时,我认为在PATH中找不到二进制文件是相当常见的。
打开控制台并运行

which wkhtmltopdf

这将输出二进制文件的完整路径。例如/usr/bin/wkhtmltopdf
现在将PHP代码替换为二进制文件的完整路径:

// Add the --enable-local-file-access option to enable access to local files (HTML)
$wkhtmltopdfCommand = "/usr/bin/wkhtmltopdf --enable-local-file-access {$outputHtmlPath} {$pdfOutputPath}";
shell_exec($wkhtmltopdfCommand);
hs1ihplo

hs1ihplo2#

而不是

shell_exec($wkhtmltopdfCommand);

尝试

$result = passthru($wkhtmltopdfCommand . ' 2>&1');
var_dump($result);

它应该能告诉你哪里出了问题

相关问题