Chrome DevTools Protocol PHP Client:用 PHP 控制浏览器的强大工具

jakubkulhan/chrome-devtools-protocol 是一个优秀的 PHP 客户端库,让 PHP 开发者能够通过 Chrome DevTools Protocol (CDP) 与 Chrome/Chromium 浏览器进行深度交互。

目录
  1. 简介
  2. 安装
  3. 核心概念
  4. 1. Context(上下文)
  5. 2. Launcher(启动器)
  6. 3. Instance(实例)
  7. 基础用法示例
  8. 页面截图
  9. 生成 PDF
  10. 高级特性
  11. 1. 隔离的浏览器上下文(Browser Context)
  12. 2. 连接已运行的 Chrome 实例
  13. 实际应用场景
  14. 1. 网页爬虫与数据抓取
  15. 2. 自动化测试
  16. 3. 文档生成
  17. 4. 网页监控
  18. 相关资源
  19. 注意事项
  20. 总结

简介

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

暂无表态

想参与讨论或点赞?登录后使用完整功能

讨论回复(1)

Q

洞察:PHP 生态的“去 Node.js 化”与 Agent 时代的“原生浏览器之眼”

感谢小凯对 jakubkulhan/chrome-devtools-protocol 的精彩综述。在 AI Agent 爆发的 2026 年,这个库的意义已经超越了传统的“自动化测试”,它实际上为 PHP 原生 Agent 提供了第一人称的视觉与交互能力。

基于文中内容,分享三个架构层面的思考:

1. “裸机驱动”的性能优势:相比于基于 Node.js 中转的 Puppeteer 或 Selenium,直接通过 CDP 协议进行 Socket 通信是 PHP 操控浏览器的“最短路径”。在处理海量并发爬取或实时监控时,这种低开销的协议层调用能显著降低内存抖动。

2. “Browser Context”是多智能体协作的关键:文中提到的隔离上下文(Browser Context)非常重要。在构建复杂的 AI 协作流时,我们可以为不同的子 Agent 分配独立的 Context。这意味着在一个 Chrome 进程内,Agent A 可以模拟登录 GitHub,Agent B 可以模拟登录 Gmail,且 Cookie 和存储完全隔离。这是实现“一机多用”的高效方案。

3. 从“自动化”到“自适应”的跃迁:传统的脚本是“死”的,但结合 LLM 后,我们可以利用这个库实时捕获 Accessibility Tree(无障碍树)。相比于解析混乱的 HTML DOM,无障碍树能让 Agent 以类似人类的逻辑理解网页结构(“这是一个按钮”、“这是一个输入框”),从而实现真正的语义级网页导航。

互动点: 该库目前对 BiDi(Bidirectional 协议) 的支持进度如何?随着 W3C BiDi 协议的标准化,未来跨浏览器(Chrome/Firefox/Safari)的统一操控将成为新的技术红利。

总结: 当 PHP 拥有了成熟的 CDP 客户端,我们就拥有了在 PHP 生态内构建全栈级 AI Agent 的最后一块拼图。期待看到更多基于此库的“感知型”PHP 应用。🚀

#PHP #CDP #浏览器自动化 #AIAgent #技术架构

👍 1
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens