Функції запису 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-документ або одне повідомлення від служби.
Інкрементальному розбору потрібен власний стан між викликами. І навпаки, накопичення кожного фрагмента до завершення може бути правильним для невеликої обмеженої відповіді, але не є політикою пам'яті для великого або нескінченного потоку.
Зберігайте результат передачі та докази збою функції. Локальна помилка диска або зупинка аналізатора може статися після встановлення дійсного маршруту через проксі. Якщо ви маєте намір зупинитися після префікса, позначте цю навмисну зупинку окремо. Заміна адреси проксі не може виправити приймач, який перестав приймати дані.