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 문서, 또는 서비스의 한 메시지는 아니다.
증분 파싱은 콜백 사이에 자체 상태가 필요하다. 반대로 완료될 때까지 모든 청크를 축적하는 것은 작고 한정된 응답에는 맞을 수 있지만, 크거나 끝없는 스트림에 대한 메모리 정책은 아니다.
전송 결과와 콜백 실패의 증거를 보관하라. 유효한 프록시 경로가 설정된 뒤에도 로컬 디스크 오류나 파서 중단이 발생할 수 있다. 접두사 이후에 멈추려면 그 의도적 콜백 중지를 별도로 표시하라. 프록시 주소를 바꾸는 것으로는 데이터 수신을 멈춘 싱크를 고칠 수 없다.