简介
jakubkulhan/chrome-devtools-protocol 是一个优秀的 PHP 客户端库,让 PHP 开发者能够通过 Chrome DevTools Protocol (CDP) 与 Chrome/Chromium 浏览器进行深度交互。
CDP 是 Chrome 浏览器内置的调试协议,允许开发者远程控制浏览器的几乎所有功能,包括页面导航、截图、PDF 生成、网络监控、DOM 操作等。
---
安装
composer require jakubkulhan/chrome-devtools-protocol
---
核心概念
1. Context(上下文)
用于设置操作的超时时间:use ChromeDevtoolsProtocol\Context;
// 创建一个 30 秒超时的上下文
$ctx = Context::withTimeout(Context::background(), 30);
2. Launcher(启动器)
负责启动和管理 Chrome 进程:use ChromeDevtoolsProtocol\Launcher;
$launcher = new Launcher();
$instance = $launcher->launch($ctx);
3. Instance(实例)
代表一个 Chrome 浏览器实例,可以打开多个标签页:// 打开新标签页
$tab = $instance->open($ctx);
$tab->activate($ctx);
// 获取 DevTools 客户端
$devtools = $tab->devtools();
---
基础用法示例
页面截图
use ChromeDevtoolsProtocol\Context;
use ChromeDevtoolsProtocol\Launcher;
use ChromeDevtoolsProtocol\Model\Page\CaptureScreenshotRequest;
$ctx = Context::withTimeout(Context::background(), 30);
$launcher = new Launcher();
$instance = $launcher->launch($ctx);
try {
$tab = $instance->open($ctx);
$tab->activate($ctx);
$devtools = $tab->devtools();
try {
$devtools->page()->enable($ctx);
$devtools->page()->navigate($ctx,
NavigateRequest::builder()
->setUrl("https://www.example.com/")
->build()
);
$devtools->page()->awaitLoadEventFired($ctx);
// 捕获截图
$response = $devtools->page()->captureScreenshot($ctx,
CaptureScreenshotRequest::builder()
->setFormat("png")
->build()
);
// 保存截图
file_put_contents('screenshot.png', base64_decode($response->data));
} finally {
$devtools->close();
}
} finally {
$instance->close();
}
生成 PDF
use ChromeDevtoolsProtocol\Model\Page\PrintToPDFRequest;
$devtools->page()->printToPDF($ctx, PrintToPDFRequest::make());
---
高级特性
1. 隔离的浏览器上下文(Browser Context)
类似于无痕模式窗口,每个上下文拥有独立的 Cookie、LocalStorage 等数据:
$ctx = Context::withTimeout(Context::background(), 10);
$launcher = new Launcher();
$instance = $launcher->launch($ctx);
try {
// 创建隔离的会话
$session = $instance->createSession($ctx);
try {
// $session 实现了 DevtoolsClientInterface
// 可以像操作普通标签页一样使用
$session->page()->enable($ctx);
$session->page()->navigate($ctx, ...);
} finally {
$session->close(); // 销毁上下文,相关数据也被清除
}
} finally {
$instance->close();
}
2. 连接已运行的 Chrome 实例
use ChromeDevtoolsProtocol\Instance\Instance;
// 连接到本地已启动的 Chrome(需带 --remote-debugging-port=9222 参数启动)
$instance = new Instance("localhost", 9222);
$ctx = Context::withTimeout(Context::background(), 30);
$tab = $instance->open($ctx);
$tab->activate($ctx);
$devtools = $tab->devtools();
// ... 进行操作
// 注意:不需要调用 ->close(),因为没有启动新进程
---
实际应用场景
1. 网页爬虫与数据抓取
- 执行 JavaScript 渲染的动态页面抓取
- 绕过简单的反爬虫机制
- 模拟用户交互行为
2. 自动化测试
- 端到端(E2E)测试
- 视觉回归测试(通过截图对比)
- 性能测试
3. 文档生成
- 将 HTML 转换为 PDF
- 生成网页缩略图
- 批量截图服务
4. 网页监控
- 监控网页性能指标
- 捕获网络请求
- 检测页面错误
相关资源
- GitHub 仓库: https://github.com/jakubkulhan/chrome-devtools-protocol
- Packagist: https://packagist.org/packages/jakubkulhan/chrome-devtools-protocol
- Chrome DevTools Protocol 文档: https://chromedevtools.github.io/devtools-protocol/
- 协议监控工具: Chrome DevTools → Settings → Experiments → Protocol Monitor
注意事项
1. Chrome 安装: 确保系统已安装 Chrome 或 Chromium 浏览器
2. 资源释放: 始终使用 try-finally 确保 $devtools->close() 和 $instance->close() 被调用
3. 超时设置: 根据网络状况合理设置 Context 的超时时间
4. 内存管理: 长时间运行的服务需要注意 Chrome 进程的内存占用
---
总结
这个 PHP 客户端库为 PHP 开发者打开了 Chrome DevTools Protocol 的大门,让我们能够在 PHP 生态中实现原本需要 Node.js (Puppeteer) 或 Python (Selenium/Playwright) 才能完成的浏览器自动化任务。对于需要与浏览器深度集成的 PHP 项目来说,这是一个非常有价值的工具。
---
License: MIT 作者: Jakub Kulhan