CURL을 통한 스트림 데이터 출력 방법
CURL을 통한 스트림 데이터를 받는 방법으로 아래에서 CURLOPT_WRITEFUNCTION 부분이 해당 부분입니다.
아래 소스의 익명 함수에선 아래가 추가 되어야 스트림 처리를 제대로 할 수 있습니다.
ob_flush();
flush();
스트립 처리가 안되는 조건이 있는데 다음과 같습니다.
1) 압축 옵션이 있는경우
압축을 하려면 전체 데이터가 있어야 하기 때문에 버퍼를 중간중간 비워 출력을 할 수 없습니다.
2) 버퍼 설정이 되어 있는 경우
버퍼 설정을 하여 해당 버퍼가 꽉찰때까지 가지고 있다가 출력하는 옵션이 되어 있다면 스트림 형태로 출력을 할 수 없습니다.
우리가 흔히 사용하는 방식은 일정양이 채워지면 청크방식으로 출력을 하는 방법을 많이 사용하고 있습니다.
또는 파일 다운로드 처럼 이미정해진 양을 출력하는 형태(컨텐츠랭스)
그리고 마지막으로 헤더의 컨텐츠 타입은 Content-Type: text/event-stream 으로 설정을 해줘야 하는데 이것에 대한 것은 아래를 참고 하시면 됩니다.
ChatGPT/PHP at main · pabburi2/ChatGPT · GitHub
잘 되고 있나에 대한 구분은 브라우저로 봤을때 출력 결과가 한꺼번에 나오는것이 아닌 버퍼를 비웠을때 내용이 브라우저에 바로 나와야 합니다.
그렇지 않으면 서버 설정문제로 원하는 결과를 보고 있는것이 아닙니다.
<?
$model = "gpt-3.5-turbo";
$header = array(
'Authorization: Bearer '.$API_KEY,
'Content-type: application/json',
);
$params = json_encode(array(
'messages' => $data,
'model' => $model,
'temperature' => 1,
'max_tokens' => 1500,
'top_p' => 1,
'frequency_penalty' => 0,
'presence_penalty' => 0,
'stream' => True
));
// create a new cURL resource
$curl = curl_init();
// set URL and other appropriate options
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
// enable streaming
curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($curl, CURLOPT_WRITEFUNCTION, function($curl, $chunk) {
// do something with the streamed data
echo $chunk;
return strlen($chunk);
});
// execute the request
curl_exec($curl);
// close cURL resource
curl_close($curl);
관련링크