1

我正在为一个内部研发项目构建一个网页截屏应用程序。

环境:Ubuntu 9.04(默认桌面安装)、Apache、PHP。

到目前为止,我有一个 bash 脚本,它接受一个参数(URL),启动 firefox,抓取屏幕并将其保存为 PNG。我试过从终端运行它,它工作正常。

这是 Bash 脚本:

#!/bin/bash
firefox $1 # Start firefox and go to the passed in URL
scrot -d 5 test.png # Take screen grab with 5 second delay

接下来我创建了一个简单的 PHP 页面,它使用 shell_exec 来运行脚本:

<?
  // Sample URL
  $url = 'http://www.google.com'; 
  // Run the script
  shell_exec('sh script.sh ' . $url);
  // Out put HTML to display image
  echo '<img src="test.png" />';
?>

但是,当调用 PHP 页面时,不会捕获屏幕。快速查看 apache 错误日志会显示以下消息:

Error: no display specified
giblib error: Can't open X display. It *is* running, yeah

我猜这是因为 apache 以不同的用户身份运行并且无法访问我的 X 显示器。

那么,任何人都可以阐明我做错了什么或如何捕获当前用户显示。

谢谢。

4

3 回答 3

2

从在 Apache 下运行的 PHP 启动 firefox 在我看来是个坏主意(它肯定感觉不对)。

我会这样做的方式:

  • 接收 URL 的 PHP 网页(在 Apache 下运行);例如表格之类的东西
    • 该页面将 URL 插入到类似数据库的系统中,该系统将用作队列
    • 此 URL 被标记为“待处理”
  • 完全独立于 Apache 的 PHP(或其他语言)脚本;例如,由 crontab 启动
    • 此脚本从数据库中的队列中选择一个 URL(例如最近的一个),并将其标记为“处理中”
    • 然后它会启动你的 shell 脚本,它会启动 firefox 并执行屏幕截图
    • 1 截图完成,队列中的 URL 标记为“完成”,截图的路径与 URL 关联
    • 这将起作用,因为它独立于 Apache
  • 另一个网页显示队列,以及每个 URL 的状态(“处理”、“处理”、“完成 + 截图路径”
    • 您甚至可以想象在用户和 URL 之间建立关联,而不是向所有人显示每个 URL+屏幕截图。

有了这个系统,有几个优点:

  • 用于网页的 php+apache
  • apache之外的php用于“系统”部分
  • 您可以将网页放在一台服务器上
  • 你可以有几台机器(linux、windows、mac——也许使用虚拟机)来制作截图
    • 允许您从不同的操作系统获取屏幕截图
    • 缩放方式更好^^

这并不是问题的真正答案,但我认为这是一种更好的方法......希望这会有所帮助!

于 2009-07-23T10:38:18.193 回答
2

这是使用 firefox 和xvfb进行屏幕捕获的指南。这种方法的优点是不会在您的主 X 服务器上打开和关闭 Firefox 窗口。它还将解决您的权限问题。

于 2009-07-23T11:44:19.230 回答
0

您不能以与 apache 相同的用户身份运行 bash 和 firefox 吗?

于 2009-07-23T10:06:21.703 回答