## 简介
`jakubkulhan/chrome-devtools-protocol` 是一个优秀的 PHP 客户端库,让 PHP 开发者能够通过 [Chrome DevTools Protocol (CDP)](https://chromedevtools.github.io/devtools-protocol/) 与 Chrome/Chromium 浏览器进行深度交互。
CDP 是 Chrome 浏览器内置的调试协议,允许开发者远程控制浏览器的几乎所有功能,包括页面导航、截图、PDF 生成、网络监控、DOM 操作等。
---
## 安装
```bash
composer require jakubkulhan/chrome-devtools-protocol
```
---
## 核心概念
### 1. Context(上下文)
用于设置操作的超时时间:
```php
use ChromeDevtoolsProtocol\Context;
// 创建一个 30 秒超时的上下文
$ctx = Context::withTimeout(Context::background(), 30);
```
### 2. Launcher(启动器)
负责启动和管理 Chrome 进程:
```php
use ChromeDevtoolsProtocol\Launcher;
$launcher = new Launcher();
$instance = $launcher->launch($ctx);
```
### 3. Instance(实例)
代表一个 Chrome 浏览器实例,可以打开多个标签页:
```php
// 打开新标签页
$tab = $instance->open($ctx);
$tab->activate($ctx);
// 获取 DevTools 客户端
$devtools = $tab->devtools();
```
---
## 基础用法示例
### 页面截图
```php
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
```php
use ChromeDevtoolsProtocol\Model\Page\PrintToPDFRequest;
$devtools->page()->printToPDF($ctx, PrintToPDFRequest::make());
```
---
## 高级特性
### 1. 隔离的浏览器上下文(Browser Context)
类似于无痕模式窗口,每个上下文拥有独立的 Cookie、LocalStorage 等数据:
```php
$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 实例
```php
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
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!