最近開發(fā)了一個(gè)項(xiàng)目,需要通過PHP生成指定URL的縮略圖,做NodeJS開發(fā)的時(shí)候,我們可以使用Headless Chrome來實(shí)現(xiàn)這個(gè)需求,在PHP生態(tài)中,有一個(gè) spatie/browsershot庫,也可以調(diào)用Headless Chrome來生成網(wǎng)頁縮略圖。下面來簡單記錄一下這個(gè)庫的使用方法和使用過程中遇到的問題。
安裝、配置spatie/browsershot庫
首先,我們需要使用 composer 來安裝 spatie/browsershot,這個(gè)不必多說。安裝完成后,就可以通過官方的文檔來調(diào)用這個(gè)庫中的類來生成縮略圖了。下面是官方的示例代碼:
use SpatieBrowsershotBrowsershot;
$browsershot = new Browsershot;
$browsershot->setNodeModulePath('/path/to/your/node_modules');
$browsershot->setNpmBinary('/path/to/your/npm');
$browsershot->setPuppeteerExecutablePath('/path/to/your/puppeteer_executable');
$browser_shot->url($site_url)
->windowSize(1440, 2000)
->fullPage()
->setScreenshotType('jpeg', 80)
->save($save_path);
看起來很簡單是吧?如果真是這樣,這篇文章就沒有存在的必要了。除了配置好需要的路徑和參數(shù),要想成功運(yùn)行上面示例代碼中的功能,我們還需要開啟一些PHP擴(kuò)展、安裝Node js,chromium 等依賴,以及一些chromium依賴的第三方庫。
開啟PHP proc_open,proc_get_status 函數(shù)
首先,我們需要開啟 PHP 的 proc_open,proc_get_status 這兩個(gè)函數(shù),browsershot 庫需要這兩個(gè)函數(shù)來執(zhí)行Node JS 命令并獲取執(zhí)行狀態(tài)。
這兩個(gè)函數(shù)在很多環(huán)境中默認(rèn)是關(guān)閉的,找到php.ini, 啟用這兩個(gè)函數(shù)即可。
安裝 Node JS 以及 Chromium 庫
browsershot 庫是調(diào)用 Node JS 環(huán)境中的 Headless Chrome 來實(shí)現(xiàn)截圖功能的,所以我們也需要把 Chromium 庫安裝好。我使用的CentOS系統(tǒng),通過下面的命令來安裝 NodeJS和 Chromium 即可。
sudo dnf module install nodejs:18
sudo dnf install chromium
如果系統(tǒng)軟件倉庫沒有提供 chromium,可以使用下面的命令來安裝。
npm i puppeteer
安裝好之后,我們需要把對(duì)應(yīng)文件的路徑記錄下來,寫到文章開頭的代碼里面。如果不確定 chromium 的安裝路徑,可以使用下面的命令查看。
node -e "console.log(require('puppeteer').executablePath())
這里需要注意:運(yùn)行PHP的用戶要有chromium bin 文件的執(zhí)行權(quán)限才可以執(zhí)行。
安裝Chromium系統(tǒng)依賴
Chromium會(huì)依賴Linux操作系統(tǒng)中的一些庫,我們需要把這些庫也安裝好,這樣chromium才能正確運(yùn)行。
sudo dnf install atk at-spi2-atk libdrm libXcomposite libXdamage libXrandr mesa-libgbm pango alsa-lib
或者
sudo apt install -y libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libgbm1 libxdamage1 libxrandr2 libasound2 libpangocairo-1.0-0 libpangoft2-1.0-0 libnss3 libxcomposite1 libxshmfence1 libxrender1 libxfixes3 libxkbcommon0
因?yàn)槊總€(gè)Linux環(huán)境都不盡相同,除了上面的依賴庫,您的環(huán)境中可能還缺少其他庫,如果上面的庫安裝好之后,browsershot 依賴運(yùn)行不起來,看browsershot的報(bào)錯(cuò)一般可以看出來缺少什么庫,安裝上即可。
browsershot性能及使用建議
browsershot所執(zhí)行的操作其實(shí)就是打開一個(gè)頁面來截圖,截圖生成的速度肯定不會(huì)太快,根據(jù)我的測(cè)試,一個(gè)寬1440像素,高2500的網(wǎng)頁,截圖生成的時(shí)間為2-3 秒之間。當(dāng)然這個(gè)時(shí)間也跟網(wǎng)頁的打開速度和服務(wù)器的整體性能有關(guān)?;谶@個(gè)速度,我們使用browsershot肯定無法執(zhí)行一些同步的截圖生成操作,一般是提前生成好縮略圖保存在服務(wù)器上,在需要的時(shí)候直接去調(diào)用生成好的圖片就可以了。


