libcurl 핸들 간에 데이터 공유

핸들 간에 데이터 공유

때때로 응용 프로그램은 전송 간에 데이터를 공유해야 합니다. 동일한 다중 핸들에 추가된 모든 쉬운 핸들은 동일한 다중 핸들의 핸들 간에 많은 공유가 자동으로 수행되지만 때로는 정확히 원하는 것이 아닙니다.

멀티 핸들

동일한 다중 핸들에 추가된 모든 간편 핸들은 연결 캐시DNS 캐시를 자동으로 공유합니다.

쉬운 핸들 간 공유

libcurl에는 일반 “공유 인터페이스”가 있으며, 여기서 응용 프로그램은 “공유 개체”를 생성한 다음 여러 손쉬운 핸들에서 공유할 수 있는 데이터를 보유합니다. 그런 다음 데이터를 공유하는 핸들 내에 보관하는 대신 공유 개체에서 데이터를 저장하고 읽습니다.

1
CURLSH *share = curl_share_init();

공유 객체는 쿠키, 연결 캐시, dns 캐시 및 SSL 세션 ID 캐시의 전체 또는 일부를 공유하도록 설정할 수 있습니다.

예를 들어 쿠키 및 DNS 캐시를 보유하도록 공유 설정:

1
2
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

그런 다음 이 공유 개체를 사용하도록 해당 전송을 설정합니다.

1
curl_easy_setopt(curl, CURLOPT_SHARE, share);

따라서 이 컬 핸들로 수행된 전송은 공유 핸들의 쿠키 및 DNS 정보를 사용하고 저장합니다. 동일한 공유 개체를 공유하기 위해 여러 개의 쉬운 핸들을 설정할 수 있습니다.

무엇을 공유할 것인가

CURL_LOCK_DATA_COOKIE - 쿠키 항아리를 공유하려면 이 비트를 설정합니다. 각각의 쉬운 핸들은 쿠키 사용을 시작하기 위해 쿠키 “엔진”을 제대로 시작해야 합니다.

CURL_LOCK_DATA_DNS - DNS 캐시는 libcurl이 이후 조회를 더 빠르게 하기 위해 확인된 호스트 이름에 대한 주소를 잠시 저장하는 곳입니다.

CURL_LOCK_DATA_SSL_SESSION - SSL 세션 ID 캐시는 libcurl이 이전 연결을 더 빨리 재개할 수 있도록 SSL 연결에 대한 재개 정보를 저장하는 곳입니다.

CURL_LOCK_DATA_CONNECT - 설정되면 이 핸들은 공유 연결 캐시를 사용하므로 재사용할 기존 연결을 찾을 가능성이 더 높아져 동일한 호스트에 직렬 방식으로 여러 번 전송할 때 성능이 더 빨라질 수 있습니다.

잠금

다중 스레드 환경에서 전송을 통해 공유 개체를 공유하려는 경우. 아마도 많은 코어가 있는 CPU가 있고 각 코어가 자체 스레드를 실행하고 데이터를 전송하기를 원하지만 여전히 다른 전송에서 데이터를 공유하기를 원할 수 있습니다. 그런 다음 뮤텍스 콜백을 설정해야 합니다.

스레딩을 사용하지 않고 한 번에 하나씩 직렬 방식으로 공유 개체에 액세스한다는 것을 알고 있으면 잠금을 설정할 필요가 없습니다. 그러나 한 번에 공유 개체에 액세스하는 전송이 두 개 이상 있는 경우 데이터 파괴 및 충돌을 방지하기 위해 뮤텍스 콜백 설정을 가져와야 합니다.

libcurl 자체는 사물을 잠그는 방법이나 사용 중인 스레딩 모델을 알지 못하기 때문에 한 번에 하나의 액세스만 허용하는 뮤텍스 잠금을 수행해야 합니다. pthreads 사용 애플리케이션에 대한 잠금 콜백은 다음과 유사할 수 있습니다.

1
2
3
4
5
6
static void lock_cb(CURL *handle, curl_lock_data data,
curl_lock_access access, void *userptr)
{
pthread_mutex_lock(&lock[data]); /* uses a global lock array */
}
curl_share_setopt(share, CURLSHOPT_LOCKFUNC, lock_cb);

해당 잠금 해제 콜백을 사용하면 다음과 같이 보일 수 있습니다.

1
2
3
4
5
6
static void unlock_cb(CURL *handle, curl_lock_data data,
void *userptr)
{
pthread_mutex_unlock(&lock[data]); /* uses a global lock array */
}
curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, unlock_cb);

공유 해제

전송은 전송 중에 공유 개체를 사용하고 동일한 개체를 공유하는 다른 핸들과 공유하도록 지정된 개체를 공유합니다.

후속 전송에서 CURLOPT_SHARE를 NULL로 설정하여 전송이 계속 공유되는 것을 방지할 수 있습니다. 이 경우 핸들은 이전에 공유된 데이터에 대한 빈 캐시로 다음 전송을 시작할 수 있습니다.

두 전송 간에 공유 개체는 다른 속성 집합을 공유하도록 업데이트되어 해당 개체를 공유하는 핸들이 다음에 다른 데이터 집합을 공유할 수도 있습니다. DNS 데이터를 공유 해제할 때 다음과 같이 curl_share_setopt()의 CURLSHOPT_UNSHARE 옵션을 사용하여 공유 개체에서 공유할 항목을 제거합니다.

1
curl_share_setopt(share, CURLSHOPT_UNSHARE, CURL_LOCK_DATA_DNS);
공유하기