Остановка передачи PHP cURL после префикса тела
Сохраняйте ограниченный префикс в callback записи и распознавайте только ту ошибку записи, которую этот callback вызывает намеренно.
Callback записи cURL может сохранять ограниченный префикс тела и останавливать передачу, как только этот предел достигнут. Используйте собственный флаг, чтобы отличить такую намеренную остановку от другой ошибки записи.
Для нового handle, у которого целевой URL уже настроен:
$limit = 32768;
$prefix = '';
$limitReached = false;
curl_setopt_array($ch, [
CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
CURLOPT_HEADER => false,
CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
use (&$prefix, &$limitReached, $limit) {
$remaining = $limit - strlen($prefix);
$prefix .= substr($chunk, 0, $remaining);
if (strlen($prefix) >= $limit) {
$limitReached = true;
return 0;
}
return strlen($chunk);
},
]);
$result = curl_exec($ch);
$error = curl_errno($ch);
$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
throw new RuntimeException(curl_error($ch), $error);
}
Схема socks5h в URL прокси просит прокси разрешить имя целевого хоста. Для разрешённой проверки публичной цели на показанном новом handle запись без учётной записи из списка SOCKS5-прокси может предоставить эту конечную точку. Проверка сертификата TLS сохраняет обычные настройки.
Возврат нуля для непустого фрагмента сообщает libcurl, что callback не принял переданные данные. Передача прерывается с CURLE_WRITE_ERROR. Здесь ожидаемым считается только сочетание этой ошибки и флага limitReached callback-а.
Ответ короче предела завершается нормально. На пределе или выше prefix хранит не более 32 KiB, даже если последний callback получает более крупный фрагмент. Размеры фрагментов различаются; запрошенный размер буфера не гарантирует вызовов фиксированной длины.
Это ограничивает сохраняемое тело, а не каждый байт, уже помещённый в буфер или переданный по соединению. Префикс может закончиться внутри многобайтового символа, значения JSON или элемента HTML, поэтому не считайте его полным разбираемым документом.