2

今天,我一直致力于为我的一个项目生成网站截图的解决方案。在深入研究了网上的各种主题后,我得出结论,使用 PhantomJS 可能是我的最佳选择。

由于我运行的是 vagrant (Homestead) 本地服务器,因此我需要将jonnyw/php-phantomjs( https://packagist.org/packages/jonnyw/php-phantomjs ) 中的包放入现有项目中,并使用基本脚本启动:

$client = Client::getInstance();
$client->debug(true);
$client->setBinDir('/home/admin/domains/domain.com/public_html/bin/');

$request = $client->getMessageFactory()->createCaptureRequest('http://www.domain.com/preview/H/31', 'GET');
$request->setCaptureFile('/home/admin/domains/domain.com/public_html/screens/sample.jpg');
$request->setViewportSize(1366, 768);

$response = $client->getMessageFactory()->createResponse();
$client->send($request, $response);

在代码停止抛出警告之前我花了一点时间,但最终代码正常工作!然后我继续将代码迁移到它应该在的项目中,该项目是用过程 php 代码编写的。我需要这个包,包括自动加载器,它执行的命令与我的 Vagrant 环境中的命令完全相同。

结果有点不同:没有显示标题,也没有显示背景图像。我可能需要补充一点,标题附加了一个自定义字体。

几周前,我为需要 Laravel 的客户端设置了一个服务器,我还需要该服务器上的包并执行相同的代码。起初我得到一些随机的白页,但最终我得到了我期望的截图。我可以忍受截图变成白色的事实,只要它们最终正确出现。

然后我回到这个脚本的目标代码并给它更多的镜头。但结果一直是白色或缺少一些元素(自定义字体标题+​​背景图像)。我最后一次尝试是更改capture.proc文件,我在渲染图像之前添加了一个 setTimeout 函数。那确实解决了一个问题:从那以后我没有任何白色图像,但没有解决最重要的问题:缺少标题和背景。

我已经仔细检查了所有 bin 文件,它们都使用 1.9.7 版的 PhantomJS,所以我怀疑那里有问题。但是服务器配置(或 PHP 版本)是否存在差异,会阻止脚本给出正确的结果?

只是为了提供尽可能多的信息,问题服务器位于最低的 PHP 版本上:

  • 问题服务器在 PHP 5.5.18 上
  • 工作服务器在 PHP 5.5.27 上
  • Homestead 服务器在 PHP 5.6.11 上
4

1 回答 1

1

看起来您应该在加载页面后和截屏之前稍等片刻。单页应用程序和 Web 字体通常需要一点时间来加载和渲染,而 PhantomJS 有点急于触发加载完成事件并报告加载已完成。

你可以挤在和$request->setDelay(2);之间。请参阅文档...->createCaptureRequest(..)$request->setCaptureFile(...)

使用静态延迟不是很稳健。最好使用在满足条件(例如页面上出现特定页面元素)时立即触发的waitFor()函数。php-phantomjs 没有通过它的 API 提供这样的功能,但是你可以直接使用一个 PhantomJS 脚本来做这种事情。请参阅文档

于 2015-10-26T21:50:18.430 回答