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 代码编写的。我需要这个包,包括自动加载器 en 执行与我的 Vagrant 环境完全相同的命令。

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

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

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

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

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

看来您确实应该在加载页面后和截取屏幕截图之前稍等片刻。单页应用程序和 Webfonts 通常需要一点时间来加载和呈现,而 PhantomJS 有点急于触发加载完成事件并报告加载已完成。

您可以在 ...->createCaptureRequest(..)$request->setCaptureFile(...) 之间挤进一个 $request->setDelay(2);。参见 documentation

使用静态延迟不是很可靠。最好使用 waitFor() function which triggers as soon as the condition (such as a specific page element appears on the page) is fulfilled. php-phantomjs doesn't provide such a functionality through it's API, but you can use a PhantomJS script directly which could do this sort of thing. See the documentation.