2015-10-26 68 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。感謝您的快速幫助! –