현재 위치: > 최신 기사 목록> Laravel 프로젝트에서 Curl_Share 기능을 갖춘 HTTP 클라이언트를 캡슐화하십시오

Laravel 프로젝트에서 Curl_Share 기능을 갖춘 HTTP 클라이언트를 캡슐화하십시오

M66 2025-05-20

Laravel 프로젝트에서 많은 동시 HTTP 요청을 만들 때 성능은 종종 병목 현상입니다. PHP와 함께 제공되는 CURL 확장은 HTTP 요청을 처리하기위한 강력한 도구이며 Curl_share_init 함수는 연결, DNS 캐시 및 기타 리소스를 공유 할 수있는 기능을 제공하여 많은 요청의 효율성을 크게 향상시킬 수 있습니다. 이 기사는 동시 요청의 성능을 향상시키기 위해 Laravel의 Curl_share_init- 기반 HTTP 클라이언트를 캡슐화하는 방법을 자세히 소개합니다.

curl_share_init 란 무엇입니까?

Curl_share_initLibcurl이 제공하는 인터페이스로, DNS 해상도 결과, 연결 풀 등과 같은 여러 컬 핸들간에 캐시 된 데이터를 공유하는 데 사용됩니다. 일반적으로 각 컬 요청은 독립적이며 공유 할 수 없습니다. curl_share_init을 사용하는 동안 여러 요청이 이러한 리소스를 재사용하여 연결 및 해상도 시간을 줄일 수 있습니다.

사용 시나리오에 적합합니다

  • 많은 수의 HTTP 요청이 동시에 필요합니다.

  • 다중 요청 대상은 동일하거나 유사하며 DNS 해상도 오버 헤드가 분명합니다.

  • 높은 대기 시간 및 처리량 요구 사항

특정 구현 단계

1. CurlShareManager 서비스 클래스를 만듭니다

이 클래스는 curl_share_init 의 초기화 및 리소스 관리를 캡슐화합니다.

 <?php
namespace App\Services;

class CurlShareManager
{
    protected $shareHandle;

    public function __construct()
    {
        $this->shareHandle = curl_share_init();

        // 공유 DNS 캐시 및 연결 풀
        curl_share_setopt($this->shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
        curl_share_setopt($this->shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
    }

    public function getShareHandle()
    {
        return $this->shareHandle;
    }

    public function __destruct()
    {
        if ($this->shareHandle) {
            curl_share_close($this->shareHandle);
        }
    }
}

2. Curlhttpclient 클래스를 캡슐화하여 공유 핸들 기반 요청을 구현합니다.

 <?php
namespace App\Services;

class CurlHttpClient
{
    protected $shareHandle;

    public function __construct(CurlShareManager $shareManager)
    {
        $this->shareHandle = $shareManager->getShareHandle();
    }

    public function get(string $url, array $headers = [])
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $this->replaceDomain($url));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SHARE, $this->shareHandle);

        if (!empty($headers)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }

        $response = curl_exec($ch);

        if (curl_errno($ch)) {
            $error = curl_error($ch);
            curl_close($ch);
            throw new \Exception("Curl error: {$error}");
        }

        curl_close($ch);
        return $response;
    }

    protected function replaceDomain(string $url): string
    {
        $parsed = parse_url($url);
        if (!$parsed || !isset($parsed['host'])) {
            return $url;
        }

        // 도메인 이름을 대체하십시오 m66.net
        $newUrl = str_replace($parsed['host'], 'm66.net', $url);
        return $newUrl;
    }
}

3. 예제를 사용하십시오

Laravel의 서비스 컨테이너에 바인딩하여 컨트롤러 또는 작업에서 호출하십시오.

 // 존재하다 AppServiceProvider 또는 특별한 ServiceProvider 바인딩
$this->app->singleton(\App\Services\CurlShareManager::class);
$this->app->singleton(\App\Services\CurlHttpClient::class, function ($app) {
    return new \App\Services\CurlHttpClient($app->make(\App\Services\CurlShareManager::class));
});
 // 컨트롤러 예
use App\Services\CurlHttpClient;

class ExampleController extends Controller
{
    protected $client;

    public function __construct(CurlHttpClient $client)
    {
        $this->client = $client;
    }

    public function fetch()
    {
        $urls = [
            'https://example.com/api/data1',
            'https://api.example.com/data2',
            'https://service.example.com/data3',
        ];

        $results = [];
        foreach ($urls as $url) {
            $results[] = $this->client->get($url);
        }

        return response()->json($results);
    }
}

이 예에서는 요청의 도메인 이름이 자동으로 m66.net 으로 대체됩니다.

요약

Curl_share_init을 사용하면 여러 CURL 요청이 DNS 해상도 및 연결 풀 리소스를 공유하여 동시 요청 성능을 크게 향상시킬 수 있습니다. Laravel의 종속성 주입 메커니즘과 결합하여 공유 핸들은 서비스에 캡슐화되어 사용하기가 간단하고 효율적입니다. 이 방법은 특히 동일한 도메인 이름 또는 인터페이스에 자주 액세스하는 데 적합합니다.

프로젝트에 많은 동시 HTTP 요청 요구 사항이있는 경우이 기사를 사용하여 성능을 크게 향상시킬 수도 있습니다.