Laravel 프로젝트에서 많은 동시 HTTP 요청을 만들 때 성능은 종종 병목 현상입니다. PHP와 함께 제공되는 CURL 확장은 HTTP 요청을 처리하기위한 강력한 도구이며 Curl_share_init 함수는 연결, DNS 캐시 및 기타 리소스를 공유 할 수있는 기능을 제공하여 많은 요청의 효율성을 크게 향상시킬 수 있습니다. 이 기사는 동시 요청의 성능을 향상시키기 위해 Laravel의 Curl_share_init- 기반 HTTP 클라이언트를 캡슐화하는 방법을 자세히 소개합니다.
Curl_share_init 는 Libcurl이 제공하는 인터페이스로, DNS 해상도 결과, 연결 풀 등과 같은 여러 컬 핸들간에 캐시 된 데이터를 공유하는 데 사용됩니다. 일반적으로 각 컬 요청은 독립적이며 공유 할 수 없습니다. curl_share_init을 사용하는 동안 여러 요청이 이러한 리소스를 재사용하여 연결 및 해상도 시간을 줄일 수 있습니다.
많은 수의 HTTP 요청이 동시에 필요합니다.
다중 요청 대상은 동일하거나 유사하며 DNS 해상도 오버 헤드가 분명합니다.
높은 대기 시간 및 처리량 요구 사항
이 클래스는 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);
}
}
}
<?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;
}
}
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 요청 요구 사항이있는 경우이 기사를 사용하여 성능을 크게 향상시킬 수도 있습니다.