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

Официальная документация.
Минимализм
1$ch = curl_init($url);
2curl_setopt($ch, CURLOPT_RETURNTRANSFER,    TRUE);      // Вернуть тело страницы
3$content = curl_exec($ch);
4curl_close($ch);
Среднемализм
1$ch = curl_init($url);
2
3curl_setopt($ch, CURLOPT_AUTOREFERER,       TRUE);      // Автоматически ставить referer
4curl_setopt($ch, CURLOPT_RETURNTRANSFER,    TRUE);      // Вернуть тело страницы
5curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,    FALSE);     // Не проверять HTTPS
6curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,    FALSE);
7curl_setopt($ch, CURLOPT_HEADER,            TRUE);      // Включить заголовки в вывод
8curl_setopt($ch, CURLINFO_HEADER_OUT,       TRUE);      // Отслеживание строки запроса
9curl_setopt($ch, CURLOPT_FOLLOWLOCATION,    TRUE);      // Переходить по локациям
10
11$content   = curl_exec($ch);
12$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
13$info_curl = curl_getinfo($ch);
14
15curl_close($ch);

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

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

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

В этом примере загрузка идет не более 12345 байт, потом она обрывается.
1curl_setopt($ch, CURLOPT_RETURNTRANSFER,    TRUE);
2curl_setopt($ch, CURLOPT_NOPROGRESS,        0);
3curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,  function($res, $dltotal, $dlnow, $ultotal, $ulnow) {
4
5    echo "$dltotal [$dlnow] $ultotal, $ulnow\n";
6    return $dlnow > 12345;
7});

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

1curl_setopt($ch, CURLOPT_HTTPHEADER, [
2    "Accept: text/html,application/xhtml+xml,application/xml",
3    "Accept-Encoding: gzip, deflate",
4    "Accept-Language: en-US;q=0.8,en;q=0.7",
5    "Cache-Control: max-age=0",
6    "Connection: Close",
7    "DNT: 1",
8    "Upgrade-Insecure-Requests: 1",
9    "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",
10]);

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

В $channel подается инициализированный $ch = curl_init() в качестве значения.
1public function multi_curl($channel) {
2
3    $active = 0;
4
5    // Запуск мультиобработчика
6    $mh = curl_multi_init();
7
8    // Добавление
9    foreach ($channel as $query_id => $ch) curl_multi_add_handle($mh, $ch);
10
11    // Ожидание исполнения
12    do { $perform = curl_multi_exec($mh, $active); }
13    while ($perform == CURLM_CALL_MULTI_PERFORM);
14
15    // Исполнение запросов
16    while ($active && $perform == CURLM_OK) {
17
18        if (curl_multi_select($mh) == -1)
19            continue;
20
21        do { $perform = curl_multi_exec($mh, $active); }
22        while ($perform == CURLM_CALL_MULTI_PERFORM);
23    }
24
25    // Закрываем все дескрипторы
26    foreach ($channel as $query_id => $ch) {
27
28        $channel[$query_id] = ['body' => curl_multi_getcontent($ch), 'ch' => $ch];
29        curl_multi_remove_handle($mh, $ch);
30    }
31
32    curl_multi_close($mh);
33    return $channel;
34}

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

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