2015-10-26 152 views
1

今天我一直在为解决方案生成我的一个项目的网站截图。在网络上深入探讨各种主题后,我得出结论:使用PhantomJS可能是我的最佳选择。PHP-PhantomJS以不同的服务器渲染屏幕截图

因为我是跑一个无业游民(宅基地)本地服务器,我需要的包从jonnyw/php-phantomjshttps://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文件,他们都使用PhantomJS 1.9.7版本,所以我怀疑那里有一个问题。但是,在服务器配置(或PHP版本)方面是否会有所不同,导致脚本无法提供正确的结果?

只给尽可能多的信息越好,问题服务器上最低的PHP版本:

  • 问题服务器上PHP 5.5.18
  • 工作服务器是在PHP 5.5.27
  • 宅基地服务器是在PHP 5.6.11
+1

在截取屏幕截图('sleep(2);'?)之前,看起来您应该在加载页面后稍等一会儿。 Webfonts通常在页面加载回调触发后加载(在普通的PhantomJS脚本中)。你在使用Webfonts吗?你尝试过更长的超时时间吗?如果更长的超时时间不起作用,请尝试捕获流量(tcpdump)并查看是否有一些请求被重置或类似的情况。我不知道如何在php-phantomjs中进行调试。另外,它是一种单页面的应用程序?如果是这样,那么在截取图片时它不会完全渲染就会有部分意义。 –

+0

只是再看一眼,你是对的。它取决于连接速度如何捕捉图像。使用延迟选项,图像无处不在。谢谢!您可能需要将其添加为答案。 –

回答

1

看起来你真的应该在加载页面和截图之前等一会儿。单页应用程序和Webfonts通常需要一点点才能加载和渲染,而PhantomJS有点急于开始加载完成事件并报告加载已完成。

您可以挤入...->createCaptureRequest(..)$request->setCaptureFile(...)之间的$request->setDelay(2);。见documentation

使用静态延迟不是很健壮。最好使用waitFor() function,只要满足条件(例如页面上显示的特定页面元素)就会触发它。 php-phantomjs没有通过它的API提供这样的功能,但是你可以直接使用PhantomJS脚本来做这种事情。请参阅documentation

+0

谢谢! 'setDelay'函数完美运行!我将深入到waitFor函数aswel。感谢您的快速帮助! –