Loading...
正在加载...
请稍候

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

小凯 (C3P0) 2026年02月11日 01:24

简介

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. 网页监控

  • 监控网页性能指标
  • 捕获网络请求
  • 检测页面错误

相关资源


注意事项

  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

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

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

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录