PHP和Xvfb的使用

5
我正在尝试在无头服务器上执行Firefox以截取网站的屏幕截图。我可以在终端使用"DISPLAY=:12 firefox -saveimage http://www.google.com/"命令成功完成此操作。但是,当我尝试使用"system("DISPLAY=:12 firefox -saveimage http://www.google.com");"时,它无法正常工作。我觉得它没有在正常的shell环境中执行。我违背了自己的判断,并为apache用户提供了一个实际的shell。如果我su到apache并执行命令,一切都很好,符合预期,但是从系统调用中它就不起作用。任何见解都非常受欢迎。
3个回答

3
我找到了解决方法。
我只需要创建一个可以为我调用它的shell脚本。在试验了一段时间后,我在脚本顶部添加了export HOME="/var/www/" 之后,成功让它工作。
希望这对其他人有所帮助。

0
经过几个小时的研究,我终于让它工作了。我遇到了与Xvfb和xfreerdp相同的问题。看起来apache2 mod_php没有为用户www-data设置home目录,因此从URL调用php脚本会导致xfreerdp崩溃,因为它需要写入~/.config/freerdp目录。另一方面,从php CLI调用它可以工作,因为shell已经在环境中设置了home目录。

不使用外部shell脚本,我通过以下方式使其工作:

<?php
exec("nohup Xvfb :12 -screen 0 1280x1024x24 -nolisten unix &");
exec("DISPLAY=:12.0 HOME=/home/www-data/ nohup xfreerdp /bpp:24 /size:1280x1024 /u:admin /p:\"XXXXXX\" /v:10.0.0.10 /cert-ignore &");

我添加了-nolisten unix以避免用户www-data创建/tmp/.X11-unix/文件夹,该目录应该归root所有。(在我的情况下,我不需要让Xvfb侦听套接字)

@William非常感谢您的意见,你救了我。


我在这里读到的是“我有一个不同但类似的问题,并通过现有答案之一的信息得到了帮助。谢谢。”这将被视为非答案。如果您想要对本页顶部的问题做出实际解决方案,请根据[答案]进行[编辑]以使其更加明显。否则,请删除此非答案。 - Yunnosch

0

很可能您设置为shell用户的环境变量存在某些依赖关系,而这些依赖关系并未被httpd的环境所满足。然而,在进行任何环境相关的操作之前,我建议您先捕获作业的stderr(例如,在其末尾添加2>/tmp/imgcaperrlog),并查看它是否有任何投诉。


我尝试过了,但它甚至没有执行。这让我想到可能是 PHP 执行系统调用的环境有所不同。 - William
是的,这肯定不同。你正在进行一项X操作,因此它将取决于那里发生的所有上下文。你可以做的一件事是将你的shell环境(set本身查看)与脚本内部的环境(**print_r($_ENV)**或类似内容)进行比较。 - chaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接