현재 위치: > 최신 기사 목록> Curl_share_init 함수를 통해 여러 핸들이 동일한 Curl_Share 객체를 공유 할 때 발생할 수있는 스레드 안전 문제를 해결하는 방법?

Curl_share_init 함수를 통해 여러 핸들이 동일한 Curl_Share 객체를 공유 할 때 발생할 수있는 스레드 안전 문제를 해결하는 방법?

M66 2025-07-18

PHP에서는 HTTP 요청에 CURL 라이브러리를 사용할 때 여러 CURL 핸들이 동일한 CURL_SHARE 객체를 공유하는 상황이 발생할 수 있습니다. 특히 동시 요청 또는 다중 스레드 환경에서 공유 리소스가 올바르게 처리되지 않으면 스레드 안전 문제가 발생할 수 있습니다. 이 기사는 Curl_share_init 함수 로이 문제를 해결하는 방법에 대해 논의하고 동일한 Curl_Share 객체를 공유 할 때 여러 핸들이 올바르게 작동하는지 확인합니다.

Curl과 Curl_share는 무엇입니까?

CURL은 서버와 다른 서버 간의 데이터 전송을위한 매우 강력한 PHP 확장입니다. 여러 프로토콜 (예 : HTTP, FTP, SMTP 등)을 지원하며 풍부한 구성 옵션이 있습니다. 동시 HTTP 요청 시나리오에서 CURL은 CURL_MULTI_* 함수를 제공하여 여러 요청을 관리합니다.

Curl_Share는 여러 개의 CURL 핸들이 동일한 자원 (예 : 쿠키, DN, 인증 정보 등)을 공유 할 수있는 메커니즘입니다. curl_share_init 함수를 사용하면 공유 객체를 초기화 할 수 있으며 여러 컬 핸들 이이 객체의 데이터를 공유 할 수 있습니다.

스레드 안전 문제

다중 컬 핸들이 동시에, 특히 다중 스레드 환경에서 동시에 실행되면 동일한 공유 리소스에 동시에 액세스하고 수정할 수 있습니다. 이러한 리소스에 올바른 스레드 동기화 메커니즘이 없으면 스레드 안전 문제가 발생하여 요청 실패 또는 잘못된 데이터가 반환됩니다.

예를 들어, 스레드 잠금 장치없이 쿠키를 동시에 공유하기 위해 동일한 curl_share 객체를 사용하여 두 개의 CURL 요청이 있다고 가정합니다. 한 번의 요청은 공유 리소스를 수정할 수 있고 다른 요청은 읽을 때 일치하지 않는 데이터를 얻습니다.

curl_share_init을 사용하여 스레드 안전 문제를 해결하는 방법?

curl_share_init 함수는 공유 객체를 초기화하고 여러 컬 핸들이 특정 리소스를 공유 할 수있는 Curl_share 리소스를 반환하는 데 사용됩니다. 스레드 안전 문제를 피하기 위해 Curl_share_setopt를 사용하여 각 컬 핸들이 충돌하지 않도록 적절한 공유 옵션을 설정할 수 있습니다.

다음은 Curl_share_init을 사용하여 스레드 안전 문제를 해결하는 간단한 예입니다.

 <?php
// 공유를 만듭니다 cURL 물체
$share = curl_share_init();

// 공유 옵션을 설정하십시오
curl_share_setopt($share, CURLSHOPT_SHARE, CURLSH_COOKIE);  // 공유 Cookie
curl_share_setopt($share, CURLSHOPT_SHARE, CURLSH_SSL_SESSION); // 공유 SSL 세션

// 두 가지를 초기화하십시오 cURL 핸들
$ch1 = curl_init();
$ch2 = curl_init();

// 설정 cURL 핸들选项
curl_setopt($ch1, CURLOPT_URL, 'https://m66.net/path/to/resource1');
curl_setopt($ch2, CURLOPT_URL, 'https://m66.net/path/to/resource2');

// 绑定공유물체
curl_setopt($ch1, CURLOPT_SHARE, $share);
curl_setopt($ch2, CURLOPT_SHARE, $share);

// 구현하다 cURL 묻다
$response1 = curl_exec($ch1);
$response2 = curl_exec($ch2);

// 오류를 확인하십시오
if(curl_errno($ch1)) {
    echo 'Error with first request: ' . curl_error($ch1);
}
if(curl_errno($ch2)) {
    echo 'Error with second request: ' . curl_error($ch2);
}

// 폐쇄 cURL 핸들
curl_close($ch1);
curl_close($ch2);

// 释放공유물체
curl_share_close($share);
?>

코드를 설명하십시오

  1. curl_share_init : 리소스를 공유하기 위해 여러 컬 핸들에 대해 공유 객체 $ 공유를 초기화합니다.

  2. curl_share_setopt : 공유 옵션을 설정합니다. 여기에서는 여러 요청이 동일한 쿠키 및 SSL 세션 정보를 공유 할 수 있도록 공유 쿠키 ( Curlsh_Cookie )와 SSL 세션 ( Curlsh_SSL_SESSION )을 설정했습니다.

  3. curl_setopt : 각 컬 핸들을 구성하고, 공유 객체 $ 공유를 지정하여 요청을 실행할 때 동일한 리소스를 공유하도록하십시오.

  4. 요청 실행 : curl_exec을 사용하여 두 개의 요청을 실행하십시오. Curl은 공유 객체를 통해 두 요청에 공유 리소스를 관리하여 스레드 안전을 보장합니다.

  5. 닫기 자원 : 요청이 완료된 후 컬 핸들을 닫고 공유 객체를 해제하여 리소스 누출을 피하십시오.