Chrome PHP: Когда ваш PHP-скрипт становится полноценным браузером

30 дек 2025
2,677
323
47
3 месяца

Знакомая ситуация? Вам нужно сделать скриншот веб-страницы, сгенерировать PDF-отчет из HTML, протестировать сложный JavaScript-интерфейс или спарсить данные с сайта, который активно использует JS. И все это — из вашего PHP-приложения. До недавнего времени это было либо болью, либо требовало обходных путей с вызовом внешних утилит и сложным парсингом вывода. Но что, если я скажу, что теперь ваш PHP-код может буквально "открыть" Chrome и делать в нем все, что делает обычный пользователь?

Именно для таких задач и был создан проект chrome-php/chrome. Это не просто библиотека, это ваш личный швейцарский нож для работы с безголовым (headless) режимом Chrome или Chromium прямо из PHP. Забудьте о костылях и велосипедах – теперь у вас есть мощный и интуитивно понятный инструмент, который позволяет автоматизировать практически любое взаимодействие с веб-страницами.

Что это за зверь и кому он пригодится?

chrome-php/chrome – это PHP-обертка над протоколом отладки Chrome DevTools. Проще говоря, она позволяет вашему PHP-приложению "общаться" с запущенным экземпляром браузера Chrome (или Chromium), отдавая ему команды и получая от него информацию. При этом браузер может работать в фоновом режиме, без графического интерфейса (тот самый "headless" режим), что идеально подходит для серверных задач.

Кому это нужно? Да практически любому PHP-разработчику, который сталкивается с задачами, выходящими за рамки простого HTTP-запроса:

  • Разработчикам, пишущим тесты: Автоматизированное UI-тестирование стало намного проще. Представьте, что вы можете симулировать действия пользователя – клики, ввод текста, скроллинг – и проверять, как на них реагирует ваш фронтенд.
  • Специалистам по парсингу: Если вам нужно извлечь данные с сайтов, которые активно используют JavaScript для рендеринга контента, обычные cURL или Guzzle не справятся. chrome-php/chrome позволяет "дождаться" полной загрузки страницы, выполнить JS и только потом получить готовый HTML.
  • Создателям контента и аналитикам: Нужны скриншоты страниц для отчетов или превью? Или, может быть, PDF-версии статей? Библиотека сделает это за вас, причем с гибкими настройками.
  • Разработчикам, которым нужна эмуляция: Хотите проверить, как сайт выглядит на разных разрешениях, с разными User-Agent или с эмуляцией мобильного устройства? Нет проблем!

Ключевые возможности: От простого к сложному

Давайте посмотрим, что умеет этот инструмент. Он предлагает удивительно простой и понятный API, который позволяет творить чудеса.

Реклама

Полный контроль над страницей: Навигация, JS и DOM

Самое базовое, но при этом самое мощное – это возможность открыть страницу и взаимодействовать с ней.

use HeadlessChromium\BrowserFactory;

$browserFactory = new BrowserFactory();
$browser = $browserFactory->createBrowser();

try {
    $page = $browser->createPage();
    $page->navigate('http://example.com')->waitForNavigation(); // Открываем страницу и ждем загрузки

    $pageTitle = $page->evaluate('document.title')->getReturnValue(); // Выполняем JS и получаем заголовок
    echo "Заголовок страницы: " . $pageTitle . "\n";

    // А еще можно получить весь HTML!
    $html = $page->getHtml();
    // echo $html;
} finally {
    $browser->close();
}

Здесь мы видим, как легко можно запустить браузер, перейти по URL, дождаться полной загрузки страницы и даже выполнить произвольный JavaScript-код. Это открывает огромные возможности для динамического парсинга или проверки состояния элементов. Кстати, waitForNavigation умеет ждать не только load, но и другие события, например, DOM_CONTENT_LOADED или NETWORK_IDLE, что очень удобно для оптимизации.

Визуальные возможности: Скриншоты и PDF

Нужно быстро сделать снимок экрана или сохранить страницу в PDF? Легко!

use HeadlessChromium\BrowserFactory;

$browserFactory = new BrowserFactory();
$browser = $browserFactory->createBrowser();

try {
    $page = $browser->createPage();
    $page->navigate('https://github.com/chrome-php/chrome')->waitForNavigation();

    // Скриншот всей страницы!
    $screenshot = $page->screenshot([
        'captureBeyondViewport' => true, // Снимаем всю страницу, а не только видимую часть
        'clip' => $page->getFullPageClip(),
        'format' => 'jpeg',
        'quality' => 90
    ]);
    $screenshot->saveToFile('github_chrome_php_full.jpg');
    echo "Скриншот сохранен: github_chrome_php_full.jpg\n";

    // PDF-файл с гибкими настройками
    $pdf = $page->pdf([
        'printBackground' => true,
        'displayHeaderFooter' => true,
        'headerTemplate' => '<div><span class="title"></span></div>',
        'footerTemplate' => '<div>Страница <span class="pageNumber"></span> из <span class="totalPages"></span></div>',
        'paperWidth' => 8.5,
        'paperHeight' => 11.0,
        'marginTop' => 0.5,
        'marginBottom' => 0.5,
        'marginLeft' => 0.5,
        'marginRight' => 0.5,
    ]);
    $pdf->saveToFile('github_chrome_php.pdf');
    echo "PDF сохранен: github_chrome_php.pdf\n";

} finally {
    $browser->close();
}

Представьте, как это упрощает генерацию отчетов или создание превью для ссылок. Можно даже задавать область для скриншота или настраивать поля и колонтитулы для PDF.

Эмуляция пользователя: Мышь, клавиатура и куки

Это уже серьезнее! Вам нужно имитировать действия реального пользователя? chrome-php/chrome позволяет "двигать" курсор, кликать, вводить текст и даже работать с комбинациями клавиш.

use HeadlessChromium\BrowserFactory;
use HeadlessChromium\Cookies\Cookie;
use HeadlessChromium\Exception\ElementNotFoundException;

$browserFactory = new BrowserFactory();
$browser = $browserFactory->createBrowser();

try {
    $page = $browser->createPage();
    $page->navigate('https://www.google.com')->waitForNavigation();

    // Вводим текст в поисковую строку
    try {
        $page->mouse()->find('textarea[name="q"]')->click(); // Находим поле и кликаем
        $page->keyboard()->typeText('Headless Chrome PHP'); // Вводим текст
        $page->keyboard()->typeRawKey('Enter'); // Нажимаем Enter
        $page->waitForNavigation(); // Ждем загрузки результатов поиска
        echo "Поиск выполнен.\n";
    } catch (ElementNotFoundException $e) {
        echo "Поле поиска не найдено.\n";
    }

    // Устанавливаем и получаем куки
    $page->setCookies([
        Cookie::create('my_test_cookie', 'hello_world', [
            'domain' => 'www.google.com',
            'expires' => time() + 3600
        ])
    ])->await();
    echo "Куки установлены.\n";

    $cookies = $page->getCookies();
    foreach ($cookies as $cookie) {
        if ($cookie->getName() === 'my_test_cookie') {
            echo "Найден мой куки: " . $cookie->getValue() . "\n";
        }
    }

} finally {
    $browser->close();
}

Это просто фантастика для автоматизированного тестирования форм, взаимодействия с элементами на AJAX-страницах или для сценариев, где нужно авторизоваться и поддерживать сессию.

Гибкость и отладка: Настраиваем под себя

Библиотека предоставляет множество опций для тонкой настройки поведения Chrome.

  • Режим без головы (Headless) или с головой: По умолчанию Chrome запускается в headless-режиме. Но для отладки вы можете легко отключить его, чтобы видеть, что происходит в браузере:

    $browser = $browserFactory->createBrowser(['headless' => false]); // Теперь Chrome будет виден!
    

    Это очень удобно, когда нужно понять, почему скрипт ведет себя не так, как ожидалось.

  • Прокси-серверы и User-Agent: Вам нужно, чтобы запросы шли через определенный прокси или с конкретным User-Agent? Нет проблем, эти опции легко настраиваются на уровне браузера или даже отдельной страницы.

    $browserFactory->setOptions([
        'proxyServer' => '127.0.0.1:8080',
        'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    ]);
    

    Это особенно полезно для парсинга, чтобы обходить некоторые ограничения или имитировать разных клиентов.

  • Сохранение сессии: Если вам нужно, чтобы Chrome не закрывался после завершения скрипта, или вы хотите переподключаться к уже запущенному экземпляру, chrome-php/chrome умеет и это. Это позволяет значительно ускорить работу, избегая повторного запуска браузера.

Под капотом: Как это работает?

chrome-php/chrome требует PHP версий 7.4-8.5 и установленного Chrome или Chromium версии 65+. Установка, как и положено в мире PHP, осуществляется через Composer:

composer require chrome-php/chrome

Библиотека общается с Chrome через его DevTools Protocol, используя WebSocket-соединение. Это позволяет отправлять низкоуровневые команды и получать события от браузера, а chrome-php/chrome предоставляет удобную объектно-ориентированную обертку над этим протоколом. Разработчики позаботились о том, чтобы API был "IDE friendly", что означает хорошую автодополняемость и подсказки в вашей любимой среде разработки.

Интересно, что библиотека поддерживает как синхронный, так и асинхронный режимы работы, что дает гибкость при построении сложных сценариев.

Практическое применение: Где это можно использовать?

Помимо уже упомянутых, вот еще несколько реальных сценариев:

  1. Мониторинг доступности и производительности сайтов: Запускайте скрипты, которые периодически посещают ваш сайт, делают скриншоты, измеряют время загрузки и проверяют наличие ключевых элементов. Если что-то пойдет не так, вы получите уведомление.
  2. Автоматическое заполнение форм: Если у вас есть рутинные задачи по заполнению форм на внешних ресурсах, chrome-php/chrome может взять это на себя.
  3. Генерация динамических превью: Для статей, товаров или других сущностей, где нужно показать, как выглядит страница, но нет возможности сделать это средствами сервера (например, из-за сложного JS).
  4. Тестирование адаптивности: Меняйте размер окна браузера (setViewport) и делайте скриншоты, чтобы убедиться, что ваш сайт хорошо выглядит на разных устройствах.

Выводы: Стоит ли попробовать?

Однозначно да! Если вы PHP-разработчик и когда-либо сталкивались с необходимостью автоматизировать действия в браузере, chrome-php/chrome – это тот инструмент, который стоит изучить. Он значительно упрощает сложные задачи, связанные с веб-страницами, которые активно используют JavaScript.

Библиотека активно поддерживается, имеет хорошее сообщество (более 2600 звезд на GitHub – это о чем-то говорит!) и предоставляет богатый функционал, который постоянно расширяется. От базовой навигации до тонкой эмуляции пользователя и работы с DOM – здесь есть все, чтобы ваш PHP-скрипт стал настоящим веб-серфером.

Попробуйте, и вы удивитесь, насколько проще станет решать задачи, которые раньше казались трудоемкими или даже невыполнимыми из PHP. Счастливого "браузинга" вашим PHP-скриптам!

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.