35

我有一个调用 exec() 的 PHP 脚本来执行将 PDF 转换为 JPG 的命令。该命令在 bash 中运行良好。

要抢占您最初的故障排除猜测,请注意以下几点:

  • 安全模式 = 关闭
  • 包含 PDF 和脚本的目录的权限设置为 777,该目录也是写入 JPG 的位置。
  • 我传递给 exec() 的命令明确指向正在使用的二进制文件(例如 /usr/local/bin/convert)。
  • display_errors = 开
  • error_reporting = E_ALL
  • disable_functions = [空白]
  • 我正在回显 exec() 的输出,但它什么也没返回。默认情况下运行的命令不返回任何内容。

当我从浏览器调用这个 PHP 脚本(访问http://www.example.com/script.php)时, exec() 不执行它的参数。

重要提示:我知道我的脚本或构建 bash 命令的方式没有问题,因为从 bash,我可以使用 'php' 执行脚本并且它可以工作(例如,'php script.php' 转换文件)

我也尝试过用 system() 切换 exec()。

最后,我以前曾经遇到过这个问题,但不记得我是如何解决的。

我知道我缺少一些东西,所以我希望其他人也像我一样经历过这个并记得如何解决它!

提前感谢您提供的任何帮助。

亚历克斯

4

9 回答 9

70

添加2>&1到命令的末尾以将错误从 stderr 重定向到 stdout。这应该清楚出了什么问题。

于 2009-02-11T22:00:36.690 回答
6

只是一些猜测,可能是您的网络服务器进程用户没有这样做的权限。

于 2009-02-11T21:44:41.317 回答
5

由于它在命令行下工作(将在您自己的用户帐户下),因此在我看来,Web 服务器运行的帐户(通常是“www-data”)对转换程序没有执行权限.

于 2009-02-11T21:45:34.090 回答
3

您是否考虑过文件权限?在浏览器中,php 在一个用户下运行,但是当您在 bash 中运行它时,它很可能以您的用户权限运行。

这是我要检查的第一件事。

艾米

于 2009-02-11T21:46:10.190 回答
2

您的 Apache/webserver 用户是否具有运行 shell 命令的必要权限?

当您从 cl 运行时,您可能会以不同的用户身份运行,这可以解释哪个 cl 有效,但通过浏览器无效。

于 2009-02-11T21:46:06.883 回答
2

Apache 的用户www-data需要被授予特权才能使用sudo.

  1. 运行命令sudo visudo。实际上,我们想在etc/sudoers.To 中编辑文件。为此,通过sudo visudo在终端中使用,它复制(临时)sudoers文件进行编辑。
  2. 在文件末尾,添加以下内容:-如果我们要使用命令重新启动 Smokeping 并使用 mount 命令进行其他操作,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount

(这是假设您希望使用超级用户(root)权限运行restartmount命令。)

但是,如果您希望使用超级用户权限运行每个应用程序,请添加以下内容而不是上面的内容。您可能不想这样做,而不是ALL命令,非常危险。

www-data ALL=NOPASSWD: ALL

3.编辑sudoers文件后(通过visudo我们编辑临时文件sudoers保存并退出临时文件(visudo)写入sudoers文件。(wq!

4.就是这样,现在exec()在你的xxx.php脚本中按照以下方式使用。记住sudo在php脚本中使用命令之前使用。

前任:-

exec ("sudo /etc/init.d/smokeping restart 2>&1");

因此,在您的问题中,将您希望使用的命令添加到step no (2.)我添加的内容中,并根据需要更改您的 php 脚本。

于 2014-04-09T05:08:28.170 回答
1

这可能是由于不同的用户通过 Web 服务器运行脚本和通过 bash 运行脚本。

通常,通过服务器调用的脚本/执行程序与用户“www”一样,并且该用户对您的区域没有任何写入权限。但是当您在 bash 中运行脚本时,您确实具有写入权限。

于 2009-12-19T08:55:36.527 回答
0

我已经确定这是 ImageMagick 的问题,而不是 PHP。我正在尝试一些修复,如果它们不起作用,我将最终使用一些 PHP 共享库(可能是 imagick)来代替。

于 2009-02-12T18:21:28.707 回答
0

默认输出设备已更改。

以 www 身份登录(启用后)通过 shell 提供输出,但不通过 php。

于 2010-01-14T15:19:09.140 回答