Ответ
Я активно использую cURL в PHP для интеграций с внешними API (платежными системами, сервисами доставки, социальными сетями). Работал как с нативными функциями curl_*, так и с абстракциями вроде Guzzle.
Мой опыт включает:
1. Сложные запросы:
- Работа с многоуровневыми заголовками, включая авторизацию (Bearer, Basic, OAuth).
- Отправка данных в разных форматах:
application/json,multipart/form-data(для файлов),application/x-www-form-urlencoded. - Обработка файлов cookie, сессий и редиректов.
2. Настройка и обработка ошибок:
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.example.com/v1/resource',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10, // Таймаут на соединение
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'User-Agent: MyApp/1.0'
],
CURLOPT_SSL_VERIFYPEER => true, // Всегда проверяю SSL в prod
CURLOPT_VERBOSE => true // Для дебага в dev-среде
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
// Логирую детальную ошибку
$errorMsg = curl_error($ch);
throw new ApiConnectionException('cURL error: ' . $errorMsg);
}
curl_close($ch);
// Парсинг и валидация ответа
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new ApiMalformedResponseException('Invalid JSON');
}
3. Оптимизация для высоких нагрузок:
- Использовал curlmulti функции для параллельного выполнения множества запросов, что критично для агрегации данных из нескольких источников.
- Реализовывал пулы соединений и повторные попытки (retry logic) с экспоненциальной задержкой для устойчивости к временным сбоям API.
- Интегрировал кэширование ответов внешних API, где это допустимо, чтобы снизить нагрузку.
4. Интеграция в архитектуру:
- Оборачивал вызовы cURL в отдельные сервис-классы с четкими интерфейсами.
- Использовал Dependency Injection для легкого тестирования (можно подменить моком).