我有一个PHP脚本调用exec()来执行将PDF转换为JPG的命令。这个命令在bash中运行良好。
要抢占您的初步故障排除猜测,请注意以下事项:
当我从浏览器调用此PHP脚本(访问http://www.example.com/script.php)时,exec()不会执行其参数。
重要:我知道我的脚本或构建bash命令的方式没有问题,因为从bash开始,我可以用'php'执行脚本并且它可以工作(例如'php script.php'转换文件)
我也尝试用system()切换exec()。
最后,我过去曾经遇到过这个问题,但不记得我是如何解决这个问题的。
我知道我遗失了一些东西,所以我希望有其他人像我一样体验过这一点,并记得如何解决它!
提前感谢您提供的任何帮助。
亚历
答案 0 :(得分:68)
将2>&1
添加到命令的末尾,以将错误从stderr重定向到stdout。这应该清楚地表明出了什么问题。
答案 1 :(得分:6)
只是猜测一下,可能是您的网络服务器进程用户没有权限这样做。
答案 2 :(得分:5)
因为它来自命令行(在你自己的用户帐户下),所以听起来像Web服务器运行的帐户(通常是“www-data”)没有执行权限转换计划。
答案 3 :(得分:3)
您是否考虑过文件权限?在浏览器中,php在一个用户下运行,但是当你在bash中运行时,它可能会以你的用户权限运行。
这是我要检查的第一件事。
艾米
答案 4 :(得分:2)
您的Apache / webserver用户是否具有运行shell命令的必要权限?
当您从cl运行时,您可能以不同的用户身份运行,这可能会解释哪些cl工作但是通过浏览器不能。
答案 5 :(得分:1)
这可能是由于不同的用户通过网络服务器运行脚本而脚本通过bash运行。
通常,脚本/ exec通过服务器调用,与用户'www'一样,并且该用户对您的区域没有任何写访问权限。但是当你在bash中运行脚本时,你就有了写权限。
答案 6 :(得分:1)
Apache的用户www-data
需要被授予使用sudo
执行某些应用程序的权限。
sudo visudo
。实际上我们想要在etc/sudoers
中编辑文件。为此,通过在终端中使用sudo visudo
,它会复制(临时)sudoers
文件进行编辑。 www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount
(假设您希望使用超级用户运行restart
和mount
命令
(root)特权。)
但是,如果您希望使用每个应用程序运行
超级用户权限,然后添加以下内容而不是上面的内容。您可能不想这样做,而不是ALL
命令,非常危险。
www-data ALL=NOPASSWD: ALL
3. 编辑sudoers文件后(visudo
编辑sudoers
的临时文件,保存并退出临时文件(visudo)以写入sudoers
文件。 (wq!
)
4.就是这样,现在在exec()
脚本中以下列方式使用xxx.php
。请记住在php脚本中使用命令之前使用sudo
。< /强>
例如: -
exec ("sudo /etc/init.d/smokeping restart 2>&1");
因此,在您的问题中,将我希望使用的命令添加到step no (2.)
,因为我添加并更改您想要的PHP脚本。
答案 7 :(得分:0)
我已经确定这是ImageMagick的问题,而不是PHP。我正在尝试一些修复,如果它们不起作用,我将最终使用一些PHP共享库(可能是想象)来代替它。
答案 8 :(得分:0)
默认输出设备已更改。
登录为www(启用后)通过shell提供输出,但不通过php。