cloud-castle / curl
Полнофункциональная объектная обёртка cURL для PHP 8.1+: текучие запросы, параллельный пул (curl_multi) с окном конкурентности, curl_share, cookie (RFC 6265), потоковая загрузка/выгрузка файлов с докачкой и прогрессом, ретраи с экспоненциальным backoff и Retry-After, перенаправления с повторной пров
Package info
pkg:composer/cloud-castle/curl
Requires
- php: >=8.1
- ext-curl: *
- ext-json: *
- cloud-castle/parser-json: ^1.1
- cloud-castle/parser-neon: ^1.1
- cloud-castle/parser-xml: ^1.1
- cloud-castle/parser-yaml: ^1.1
Requires (Dev)
- deptrac/deptrac: ^3.0 || ^4.0
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- icanhazstring/composer-unused: ^0.9
- infection/infection: ^0.29 || ^0.33
- php-parallel-lint/php-parallel-lint: ^1.4
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12 || ^2.1
- phpstan/phpstan-deprecation-rules: ^1.2 || ^2.0
- phpstan/phpstan-phpunit: ^1.4 || ^2.0
- phpstan/phpstan-strict-rules: ^1.6 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- psalm/plugin-phpunit: ^0.19 || ^0.20
- rector/rector: ^1.2 || ^2.0
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- vimeo/psalm: ^6.0
- webmozart/assert: ^1.11
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-03 13:04:33 UTC
README
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
CloudCastle Curl
Полнофункциональная объектная обёртка cURL для PHP 8.1+. Текучий API, параллельный пул на
curl_multiс окном конкурентности, общий пул соединенийcurl_share, cookie (RFC 6265), потоковая загрузка/выгрузка с докачкой и прогрессом, ретраи с экспоненциальным backoff иRetry-After, безопасные перенаправления с повторной проверкой SSRF на каждом хопе, HTTP/2, mTLS и пиннинг сертификата, маскирование секретов, тайминги, мок-обработчик и экспорт запроса в командуcurl, разбор ответа в JSON/XML/YAML/NEON. Сетевой слой требует толькоext-curl.
Установка
composer require cloud-castle/curl
Требуется PHP 8.1+ и расширения ext-curl, ext-json (а также ext-dom/
ext-libxml для разбора XML). Из внешних runtime-зависимостей — парсеры
экосистемы cloud-castle (parser-json/xml/yaml/neon), они ставятся
автоматически.
Быстрый старт
<?php
use CloudCastle\Curl\Curl;
// Разовый запрос через статический фасад.
$response = Curl::request('https://api.example.com/users')->get();
echo $response->status(); // 200
echo $response->header('Content-Type'); // application/json
$data = $response->json(); // разбор тела как JSON
use CloudCastle\Curl\Client;
// Настраиваемый клиент со стандартным конвейером
// (повторы → перенаправления → защита от SSRF).
$client = Client::create();
$response = $client->request('https://api.example.com/orders')
->withBearerToken('secret-token')
->withJson(['status' => 'paid'])
->withTimeout(10.0)
->withRetries(3)
->post();
use CloudCastle\Curl\Curl;
// Параллельная загрузка десятков адресов с окном конкурентности.
$pool = Curl::pool(concurrency: 20);
foreach ($urls as $key => $url) {
$pool->add($key, Curl::request($url)->build());
}
foreach ($pool->send() as $key => $result) {
if ($result->isFulfilled()) {
echo $key, ': ', $result->responseOrThrow()->status(), PHP_EOL;
}
}
Возможности
- Текучий конструктор запроса — метод, заголовки, query, тело (raw/JSON/форма/multipart), аутентификация, настройки в одном выражении.
- Параллельный пул на
curl_multiс окном конкурентности и независимыми результатами (сбой одного запроса не рушит остальные). curl_share— общий кэш DNS, TLS-сессий, cookie и соединений между запросами.- Cookie (RFC 6265) — хранилище с доменной и путевой областью,
Max-Age/Expires,Secure/HttpOnly, сохранение в файл. - Потоковые загрузка и выгрузка — запись ответа в файл или обработчик
чанков (память не растёт), докачка с
Range, обратный вызов прогресса. - Загрузка файлов —
multipart/form-dataс полями и файлами: несколько файлов, несколько файлов в одном поле (files[]), управление MIME-типом и именем, отправка из памяти без временного файла. - Разбор ответа — тело как строка (
Stringable) или разбор в структуру:json(),xml(),yaml(),neon()иparsed()с автоопределением формата поContent-Typeи содержимому (парсеры экосистемы cloud-castle). - Ретраи — экспоненциальный backoff с джиттером, учёт
Retry-After, повтор по кодам и по сетевым сбоям/таймаутам. - Безопасные перенаправления — 301/302/303 → GET, снятие учётных данных при смене хоста, повторная проверка SSRF на каждом хопе.
- Безопасность — защита от SSRF (allow-list схем, блокировка приватных диапазонов), маскирование секретов в ошибках и экспорте, безопасный TLS по умолчанию, mTLS и пиннинг сертификата, лимит размера ответа.
- Диагностика — тайминги (
curl_getinfo), экспорт запроса в командуcurl, мок-обработчик для тестов без сети.
Отдельная страница на каждую возможность — в wiki.
Сравнение с аналогами
Полные автогенерируемые таблицы (функционал, производительность, память, безопасность, качество кода) с графой 🏆 Победитель — в wiki/Comparison. Сравниваются Guzzle, Symfony HttpClient, Buzz, PHP-HTTP cURL client, а также прямое использование расширения cURL.
CloudCastle Curl — суперсет их возможностей в одном пакете без тяжёлых зависимостей: пул + share + cookie + докачка + SSRF-защита + экспорт команды — из коробки и за единым текучим API.
Плюсы и минусы (честно)
Плюсы
- Богатейший функционал в классе: то, что у аналогов разнесено по пакетам и расширениям, здесь собрано за одним API.
- Безопасность по умолчанию: SSRF-защита на каждом хопе, маскирование секретов, строгий TLS.
- Лёгкое ядро: из внешних runtime-зависимостей — только парсеры экосистемы
cloud-castle (
parser-json/xml/yaml/neon) для разбора тела ответа; сетевой слой опирается лишь наext-curl. - Низкое потребление памяти: потоковые загрузка/выгрузка не буферизуют тело целиком; размер ответа ограничен сверху ещё во время приёма.
- 100% покрытие строк, MSI 100%, полный статический анализ (PHPStan max, Psalm errorLevel 1).
Минусы
- Пакет моложе и менее распространён, чем Guzzle и Symfony HttpClient (меньше звёзд/установок и меньше готовых сторонних интеграций). Это единственный честный минус: по функционалу, производительности, безопасности и качеству кода пакет их превосходит.
- Не реализует PSR-18 напрямую (это объектная обёртка над cURL со своим API); если нужен строгий PSR-18 поверх PSR-7, используйте cloud-castle/http-client.
Рекомендации по применению
- Интеграции с внешними API (платежи, доставка, партнёрские сервисы) — ретраи, идемпотентные повторы, тайминги и маскирование секретов из коробки.
- Массовый сбор данных / фан-аут — пул
curl_multiс окном конкурентности и общимcurl_shareдаёт высокую пропускную способность при низкой памяти. - Загрузка и раздача файлов —
multipart-загрузка (несколько файлов, MIME/имя, из памяти) и потоковая выгрузка/загрузка с докачкой и прогрессом без роста памяти. - Серверный код, принимающий пользовательские URL (вебхуки, превью ссылок, импорт по URL) — встроенная защита от SSRF на каждом хопе.
- Отладка и воспроизведение — экспорт запроса в команду
curlи мок-обработчик для детерминированных тестов.
Когда лучше взять другое: строгий PSR-18 поверх PSR-7 —
cloud-castle/http-client; асинхронность на event-loop (ReactPHP/Amp) —
специализированные клиенты.
Разработка
composer install
composer check # линтеры + статический анализ + тесты
composer fix # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci # полный CI-пайплайн локально
Полный список команд с описаниями: composer run-script --list.
Документация
- Wiki (возможности, архитектура, сравнения, диаграммы): wiki/Home.md
- История изменений: CHANGELOG.md
- Переход между версиями: UPGRADING.md
- Как внести вклад: CONTRIBUTING.md
- Политика безопасности: SECURITY.md
Лицензия
MIT © CloudCastle (alex-4-17@yandex.ru)
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano