今天我一直在爲解決方案生成我的一個項目的網站截圖。在網絡上深入探討各種主題後,我得出結論:使用PhantomJS可能是我的最佳選擇。PHP-PhantomJS以不同的服務器渲染屏幕截圖
因爲我是跑一個無業遊民(宅基地)本地服務器,我需要的包從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文件,他們都使用PhantomJS 1.9.7版本,所以我懷疑那裏有一個問題。但是,在服務器配置(或PHP版本)方面是否會有所不同,導致腳本無法提供正確的結果?
只給儘可能多的信息越好,問題服務器上最低的PHP版本:
- 問題服務器上PHP 5.5.18
- 工作服務器是在PHP 5.5.27
- 宅基地服務器是在PHP 5.6.11
在截取屏幕截圖('sleep(2);'?)之前,看起來您應該在加載頁面後稍等一會兒。 Webfonts通常在頁面加載回調觸發後加載(在普通的PhantomJS腳本中)。你在使用Webfonts嗎?你嘗試過更長的超時時間嗎?如果更長的超時時間不起作用,請嘗試捕獲流量(tcpdump)並查看是否有一些請求被重置或類似的情況。我不知道如何在php-phantomjs中進行調試。另外,它是一種單頁面的應用程序?如果是這樣,那麼在截取圖片時它不會完全渲染就會有部分意義。 –
只是再看一眼,你是對的。它取決於連接速度如何捕捉圖像。使用延遲選項,圖像無處不在。謝謝!您可能需要將其添加爲答案。 –