PHP-PhantomJS在不同的服务器上呈现不同的屏幕截图


PHP-PhantomJS renders screenshots on different servers differently

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

由于我正在运行一个流浪(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

看起来你应该在加载页面后再截图。单页应用程序和Webfonts通常需要一点时间来加载和渲染,而PhantomJS在触发load finished事件并报告加载已经完成时有点着急。

可以在...->createCaptureRequest(..)$request->setCaptureFile(...)之间挤进一个$request->setDelay(2);。看到文档。

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