今天,我一直致力于为我的某个项目生成网站截图的解决方案。在网上深入探讨各种主题之后,我得出的结论是,使用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代码编写的。我需要包,包括autoloader en执行与我的Vagrant环境完全相同的命令。
结果有点不同:标题没有显示,背景图像也没有显示。我可能需要添加标题附加了自定义字体。
几个星期前,我为需要Laravel的客户端设置了服务器,我还需要该服务器上的软件包并执行相同的代码。起初我得到一些随机的白页,但最终我得到了我期望的截图。我可以忍住这样一个事实,即屏幕截图变成白色,只要它们最终出现正确。
然后我回到了这个脚本的目的代码,并给了它几个镜头。但结果保持白色或缺少一些元素(自定义字体标题+背景图像)。我的最后一次尝试是更改capture.proc
文件,我在渲染图像之前添加了一个setTimeout函数。这确实解决了一个问题:我从未有任何白色图像,但没有解决最重要的问题:缺少标题和背景。
我已经仔细检查了所有bin文件,他们都使用了PhantomJS的1.9.7版,所以我怀疑那里有一个问题。但是,服务器配置(或PHP版本)会阻止脚本提供正确的结果吗?
只是提供尽可能多的信息,问题服务器是最低的PHP版本:
答案 0 :(得分:1)
看起来你应该在加载页面后和截取屏幕之前稍等一下。单页应用程序和Webfonts通常需要一些加载和渲染,而PhantomJS有点急于解决加载完成事件并报告加载已完成。
您可以在$request->setDelay(2);
和...->createCaptureRequest(..)
之间挤压$request->setCaptureFile(...)
。请参阅documentation。
使用静态延迟不是很强大。最好使用waitFor()
function,只要满足条件(例如页面上显示的特定页面元素),就会触发documentation。 php-phantomjs没有通过它的API提供这样的功能,但你可以直接使用PhantomJS脚本来做这种事情。请参阅。