Curl init: примеры (PHP)

Использование curl_init для HTTP-запросов в PHP
Раздел: Сетевые функции (cURL)
curl_init(string $url = null): CurlHandle|false

Основы функции curl_init в PHP

Описание и назначение

Функция curl_init инициализирует сеанс библиотеки cURL (Client URL). Она применяется для взаимодействия с различными серверами по множеству протоколов, включая HTTP, HTTPS, FTP, SFTP.

Основное использование - отправка HTTP-запросов (GET, POST, PUT, DELETE) к удаленным серверам, загрузка файлов, работа с API, парсинг веб-страниц.

Аргументы функции

Функция принимает один необязательный аргумент:

  • url (string | null) - URL-адрес, с которым будет работать сеанс cURL. Если передан null или опущен, сеанс создается без начального URL, который можно установить позже через curl_setopt с параметром CURLOPT_URL.

Функция возвращает ресурс типа cURL handle (в PHP 8 - объект CurlHandle) в случае успеха или false при неудаче.

Простые примеры использования curl_init

Базовый GET-запрос
<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
{"status":"success","data":[...]}
POST-запрос с данными
<?php
$ch = curl_init('https://api.example.com/post');
$postData = ['key' => 'value'];
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query($postData)
]);
$result = curl_exec($ch);
curl_close($ch);
Ответ от сервера принят.
Запрос с заголовками
<?php
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => 'https://api.example.com',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer token123', 'Content-Type: application/json'],
    CURLOPT_RETURNTRANSFER => true
]);

Альтернативы cURL в PHP

Функция file_get_contents с контекстом

Используется для простых GET-запросов. Позволяет читать содержимое файла или URL как строку. Менее гибкая, но проще для базовых задач.

$context = stream_context_create(['http' => ['method' => 'GET']]);
$result = file_get_contents('https://example.com', false, $context);
Расширение HTTP (PECL http)

Предоставляет объектно-ориентированный интерфейс для HTTP-запросов. Удобно для сложных сценариев, но требует установки дополнительного расширения.

Библиотека Guzzle

Современная PHP-библиотека для HTTP-запросов. Имеет асинхронные возможности, пулы соединений, middleware. Рекомендуется для сложных проектов.

Типичные ошибки при работе с curl_init

Отсутствие проверки на ошибки
<?php
$ch = curl_init('invalid://url');
curl_exec($ch); // Молчаливая ошибка
?>
Ничего не происходит, функция возвращает false.
Неправильная обработка SSL-сертификатов
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Небезопасно!
Утечка ресурсов
$ch = curl_init();
// Забыли вызвать curl_close()
Некорректные опции
curl_setopt($ch, 'INCORRECT_OPTION', true); // Тихая ошибка

Изменения в curl init в новых версиях PHP

PHP 8.0: объект CurlHandle

Функция теперь возвращает объект CurlHandle вместо ресурса. Это улучшает типобезопасность и согласуется с общей политикой отказа от ресурсов.

<?php
$ch = curl_init();
var_dump($ch);
?>
object(CurlHandle)#1 (0) { }
PHP 7.0: удалены устаревшие опции

Удалены устаревшие константы, такие как CURLOPT_CLOSEPOLICY и связанные с ними.

Расширенные примеры работы с cURL

Параллельные запросы с curl_multi
Пример php
<?php
$urls = ['https://api1.example.com', 'https://api2.example.com'];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running);
foreach ($handles as $ch) {
    echo curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
?>
Загрузка файла с прогрессом
Пример php
function progressCallback($resource, $downloadSize, $downloaded, $uploadSize, $uploaded) {
    if ($downloadSize > 0) {
        $percent = $downloaded / $downloadSize * 100;
        echo "Загружено: $percent%\n";
    }
}
$ch = curl_init('https://example.com/largefile.zip');
$fp = fopen('local.zip', 'w');
curl_setopt_array($ch, [
    CURLOPT_FILE => $fp,
    CURLOPT_NOPROGRESS => false,
    CURLOPT_PROGRESSFUNCTION => 'progressCallback'
]);
curl_exec($ch);
Работа с куками
Пример php
$ch = curl_init('https://example.com/login');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEJAR => 'cookies.txt', // Сохранить куки после запроса
    CURLOPT_COOKIEFILE => 'cookies.txt', // Отправить куки с запросом
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => 'user=admin&pass=123'
]);
curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, 'https://example.com/dashboard');
curl_setopt($ch, CURLOPT_POST, false);
$dashboard = curl_exec($ch); // Запрос с сохраненными куками
Кастомные HTTP-методы и заголовки
Пример php
$ch = curl_init('https://api.example.com/resource');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json-patch+json',
        'X-Custom-Header: value'
    ],
    CURLOPT_POSTFIELDS => '[{"op": "replace", "path": "/name", "value": "new"}]'
]);

Аналоги curl_init в других языках

Python: библиотека requests

Более высокоуровневый и удобный интерфейс по сравнению с cURL.

import requests
response = requests.get('https://api.example.com/data')
print(response.json())
JavaScript: Fetch API

Современный API для HTTP-запросов, основанный на промисах.

fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log(data));
MySQL: функция LOAD_DATA

Позволяет загружать данные из файла или URL в таблицу, но с ограниченной поддержкой протоколов.

LOAD DATA INFILE 'https://example.com/data.csv'
INTO TABLE my_table;

PHP curl_init function comments

En
Curl init Initialize a cURL session