§ Базовый запрос

Официальная документация.
Минимализм
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,    TRUE);      // Вернуть тело страницы
$content = curl_exec($ch);
curl_close($ch);
Среднемализм
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_AUTOREFERER,       TRUE);      // Автоматически ставить referer
curl_setopt($ch, CURLOPT_RETURNTRANSFER,    TRUE);      // Вернуть тело страницы
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,    FALSE);     // Не проверять HTTPS
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,    FALSE);
curl_setopt($ch, CURLOPT_HEADER,            TRUE);      // Включить заголовки в вывод
curl_setopt($ch, CURLINFO_HEADER_OUT,       TRUE);      // Отслеживание строки запроса
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,    TRUE);      // Переходить по локациям

$content   = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$info_curl = curl_getinfo($ch);

curl_close($ch);

§ Дополнительные параметры

Запрос POST
curl_setopt($ch, CURLOPT_POST,       TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
Загрузка файла
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    "file" => curl_file_create("myfilename.txt"),
]);
Если $data это строка, то отсылка будет в виде строки, если array, то добавится заголовок Content: multipart/form-data и сформируется http_build_query строка.
Запрос с заголовками в качестве параметра - массив с перечисленными заголовками.
curl_setopt($ch, CURLOPT_HTTPHEADER,    ["Set-Cookie: a=b", "User-Agent: MyAgent"]);
Basic Auth
curl_setopt($ch, CURLOPT_HTTPHEADER,    ["Authorization: Basic " . base64_encode("login:password")]);
Использование прокси SOCKS5
curl_setopt($ch, CURLOPT_PROXY,             "localhost");
curl_setopt($ch, CURLOPT_PROXYPORT,         9050);
curl_setopt($ch, CURLOPT_PROXYTYPE,         CURLPROXY_SOCKS5_HOSTNAME);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL,   TRUE);
Cтандартный прокси
curl_setopt($ch, CURLOPT_PROXYTYPE,         CURLPROXY_HTTP);

§ Ограничение загрузки крупного файла

В этом примере загрузка идет не более 12345 байт, потом она обрывается.
curl_setopt($ch, CURLOPT_RETURNTRANSFER,    TRUE);
curl_setopt($ch, CURLOPT_NOPROGRESS,        0);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,  function($res, $dltotal, $dlnow, $ultotal, $ulnow) {

    echo "$dltotal [$dlnow] $ultotal, $ulnow\n";
    return $dlnow > 12345;
});

§ Стандартные заголовки

curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Accept: text/html,application/xhtml+xml,application/xml",
    "Accept-Encoding: gzip, deflate",
    "Accept-Language: en-US;q=0.8,en;q=0.7",
    "Cache-Control: max-age=0",
    "Connection: Close",
    "DNT: 1",
    "Upgrade-Insecure-Requests: 1",
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
]);

§ Мультизапрос

В $channel подается инициализированный $ch = curl_init() в качестве значения.
public function multi_curl($channel) {

    $active = 0;

    // Запуск мультиобработчика
    $mh = curl_multi_init();

    // Добавление
    foreach ($channel as $query_id => $ch) curl_multi_add_handle($mh, $ch);

    // Ожидание исполнения
    do { $perform = curl_multi_exec($mh, $active); }
    while ($perform == CURLM_CALL_MULTI_PERFORM);

    // Исполнение запросов
    while ($active && $perform == CURLM_OK) {

        if (curl_multi_select($mh) == -1)
            continue;

        do { $perform = curl_multi_exec($mh, $active); }
        while ($perform == CURLM_CALL_MULTI_PERFORM);
    }

    // Закрываем все дескрипторы
    foreach ($channel as $query_id => $ch) {

        $channel[$query_id] = ['body' => curl_multi_getcontent($ch), 'ch' => $ch];
        curl_multi_remove_handle($mh, $ch);
    }

    curl_multi_close($mh);
    return $channel;
}

§ Загрузка в файл

$fp = fopen("filename.txt", "wb+");
// curl init code
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
fclose($fp);

§ Отсылка файла

$curl = curl_init();
curl_setopt($curl, CURLOPT_PUT, 1 );
curl_setopt($curl, CURLOPT_INFILESIZE, filesize($tmpFile) );
curl_setopt($curl, CURLOPT_INFILE, ($in=fopen($tmpFile, 'r')) );
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST' );
curl_setopt($curl, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ] );
curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1 );
$result = curl_exec($curl);
curl_close($curl);
fclose($in);