代表ライブラリ:chrome-php/chrome
概要:PHP で Headless Chrome/Chromium を起動・制御(ページ遷移、HTML投入、PDF/スクショ生成、要素操作、JS実行など)。MITライセンス。
入手:GitHub/Packagist に公式。
特徴:CDP を直接話すので Node 不要。Puppeteer 相当の機能を PHP から扱える
[Chrome/Chromium を入れる]
sudo dnf install -y chromium
・日本語フォントのインストール
“入手できる日本語フォント”を探す
# 候補を検索
dnf search noto cjk
dnf search "source han" jp
dnf search vlgothic
dnf search ipa ex # IPAex 系があるか探す
見つかったものをインストール
sudo dnf install -y -y google-noto-sans-cjk-vf-fonts google-noto-serif-cjk-vf-fonts
フォントキャッシュを更新
sudo fc-cache -fsv
# 確認
fc-list :lang=ja | head
[composer]インストール方法
sudo dnf install php-cli php-json php-zip wget unzip -y
php -r "copy('
https://getcomposer.org/installer', 'composer-setup.php');"
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
composer -V
→ Composer version 2.x.x などが出ればOK。
[導入方法]
composer require chrome-php/chrome
・読み込み
<?php
require __DIR__ . '/vendor/autoload.php';
use HeadlessChromium\BrowserFactory;
$browser = (new BrowserFactory())->createBrowser(); // Chrome/Chromium を起動
$page = $browser->createPage(); // 新規タブ
$page->setHtml('<h1>こんにちは</h1>'); // HTMLを直接投入
$page->pdf(['printBackground' => true])
->saveToFile('/path/output.pdf'); // PDF保存
$browser->close();
・よく使うオプション(PDF/ページ)
$page->pdf([
'printBackground' => true, // 背景やWebフォントの印刷
'displayHeaderFooter' => true, // ヘッダ/フッタ
'headerTemplate' => '<div style="font-size:8px;width:100%;text-align:center;">My Doc</div>',
'footerTemplate' => '<div style="font-size:8px;width:100%;text-align:center;"><span class="pageNumber"></span>/<span class="totalPages"></span></div>',
'marginTop' => 10, 'marginBottom' => 10, 'marginLeft' => 10, 'marginRight' => 10,
'paperWidth' => 8.27, 'paperHeight' => 11.69, // A4 (inch指定)
]);
$page->setViewport(1280, 900); // ビューポート
$page->emulateMediaType('screen'); // or 'print'
$page->addScriptTag(['content' => '/* 任意のJS */']);
$page->addStyleTag(['content' => '/* 任意のCSS */']);
・URLレンダリング/認証・クッキー・ヘッダ
// URLを開く(ログインページ等)
$page->navigate('
https://example.com/secure')->waitForNavigation();
// Cookie付与(セッション引き継ぎ)
$client = $page->getSession()->getConnection()->getSocketClient();
$page->getSession()->sendMessage(
new \HeadlessChromium\Communication\Message('Network.setCookie', [
'name' => 'session', 'value' => 'abc', 'domain' => 'example.com', 'path' => '/'
])
);
// リクエストヘッダ差し替え例(認証トークンなど)
$page->getSession()->sendMessage(
new \HeadlessChromium\Communication\Message('Network.setExtraHTTPHeaders', [
'headers' => ['Authorization' => 'Bearer ...']
])
);
・すぐ使えるスターター(堅め)
<?php
require __DIR__ . '/vendor/autoload.php';
use HeadlessChromium\BrowserFactory;
$factory = new BrowserFactory('/usr/bin/chromium-browser'); // パスは環境に合わせる
$browser = $factory->createBrowser([
'noSandbox' => false, // 可能ならサンドボックス有効のまま
'windowSize' => [1280, 900],
'enableImages' => true,
'keepAlive' => true, // 複数ジョブで再利用
]);
try {
$page = $browser->createPage();
$page->setHtml($html); // あるいは $page->navigate($url)->waitForNavigation();
// SPAなら描画待ち(例:#app-loaded が出現)
$page->waitForFunction("document.querySelector('#app-loaded') !== null", 8000);
$page->pdf([
'printBackground' => true,
'marginTop' => 10, 'marginBottom' => 10, 'marginLeft' => 10, 'marginRight' => 10,
])->saveToFile($outPath);
} finally {
$browser->close();
}