Функции записи PHP cURL должны возвращать количество обработанных байт
Соблюдайте контракт подсчёта байт при обработке фрагментов ответа прокси и отличайте локальную ошибку записи от неудачного подключения к прокси.
Прокси доставляет данные. Ваша функция записи возвращает неверное значение. Тогда libcurl прерывает работу, а окружающий код сообщает об очередной «ошибке загрузки через прокси».
Функция должна сообщать, сколько полученных байт она фактически обработала. Возврат другого числа означает ошибку. Для намеренно блокирующего приёмника записи фрагмент может выглядеть так:
curl_setopt($handle, CURLOPT_PROXY, 'http://proxy.example:8080');
curl_setopt($handle, CURLOPT_WRITEFUNCTION,
function ($handle, $chunk) use ($sink) {
$written = fwrite($sink, $chunk);
return $written === false ? 0 : $written;
}
);Это предполагает, что существующее приложение владеет дескриптором и приёмником записи. Неудачная или короткая запись прерывает работу, а не заявляет молча, что весь фрагмент сохранён. Неблокирующему приёмнику нужен подходящий проект буферизации и приостановки/возобновления; небольшой фрагмент его не даёт.
Считайте байты, а не отображаемые символы. Данные могут быть двоичными или частью многобайтовой текстовой последовательности. Один вызов — не обязательно одна строка, один JSON-документ или одно сообщение от службы.
Инкрементному разбору нужно собственное состояние между вызовами. И наоборот, накопление каждого фрагмента до завершения может быть правильным для небольшого ограниченного ответа, но не является политикой памяти для большого или бесконечного потока.
Сохраняйте результат передачи и доказательства сбоя функции. Локальная ошибка диска или остановка анализатора может произойти после установления допустимого маршрута через прокси. Если вы намерены остановиться после префикса, отметьте эту намеренную остановку отдельно. Замена адреса прокси не может исправить приёмник, который перестал принимать данные.