PHP 和 Xvfb 用法

问题描述 投票:0回答:3

我正在尝试在无头服务器上执行 firefox 以获取网站的屏幕截图。我可以在终端使用

做到这一点

“DISPLAY=:12 firefox -saveimage http://www.google.com/”。

问题是当我尝试做 system("DISPLAY=:12 firefox -saveimage http://www.google.com");不起作用。我有一种感觉,它不是在正常的 shell 环境中执行的。我违背了我更好的判断,给了 apache 用户一个实际的 shell。如果我 su 到 apache 并执行命令,一切都很好并且按预期工作,但它再次无法通过系统调用工作。任何见解都非常受欢迎。

php linux terminal xvfb
3个回答
3
投票

我找到了解决方案。

我只需要创建一个 shell 脚本来为我调用它。玩了一会儿后,我在脚本顶部添加了

export HOME="/var/www/"
后就开始工作了。

我希望这对其他人有帮助。


0
投票

很可能对您设置为 shell 用户的环境变量有一些依赖性,而 httpd 的环境无法实现。不过,在对环境进行任何英雄行为之前,我建议从您的工作中捕获 stderr(例如,通过在其末尾添加

2>/tmp/imgcaperrlog
)并查看它是否提出任何投诉。


0
投票

经过几个小时的研究,我开始工作了,我在 Xvfb 和 xfreerdp 上遇到了同样的问题。 似乎 apache2 mod_php 没有为用户 www-data 设置一个家,所以从 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 非常感谢您的投入,你和我一样。

© www.soinside.com 2019 - 2024. All rights reserved.