Die Leistung ist häufig ein Engpass, wenn eine große Anzahl von gleichzeitigen HTTP -Anfragen in einem Laravel -Projekt eine große Anzahl von HTTP -Anfragen erstellt. Die Curl -Erweiterung, die mit PHP ausgestattet ist, ist ein leistungsstarkes Werkzeug zum Umgang mit HTTP -Anforderungen, und die Funktion curl_share_init bietet die Möglichkeit, Verbindungen, DNS -Cache und andere Ressourcen zu teilen, was die Effizienz einer großen Anzahl von Anfragen erheblich verbessern kann. In diesem Artikel wird ausführlich vorgestellt, wie ein HTTP -Client von CULL_SHARE_INIT Basis in Laravel in Laravel zusammengefasst wird, um die Leistung gleichzeitiger Anforderungen zu verbessern.
curl_share_init ist eine von libcurl bereitgestellte Schnittstelle, mit der zwischen mehreren COLL -Handles zwischengespeicherten Daten, wie DNS -Auflösungsergebnisse, Verbindungspools usw. verwendet werden. Normalerweise ist jede Curl -Anforderung unabhängig und kann nicht geteilt werden. Während der Verwendung von curl_share_init können mehrere Anforderungen diese Ressourcen wiederverwenden und die Verbindungs- und Auflösungszeit verkürzen.
Gleichzeitig ist eine große Anzahl von HTTP -Anfragen erforderlich
Mehrere Anforderungsziele sind gleich oder ähnlich, und die DNS -Auflösung Overhead ist offensichtlich
Hohe Latenz- und Durchsatzanforderungen
Diese Klasse verkauft die Initialisierung und Ressourcenverwaltung von curl_share_init .
<?php
namespace App\Services;
class CurlShareManager
{
protected $shareHandle;
public function __construct()
{
$this->shareHandle = curl_share_init();
// geteilt DNS Cache- und Verbindungspool
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;
}
// Ersetzen Sie den Domainnamen als m66.net
$newUrl = str_replace($parsed['host'], 'm66.net', $url);
return $newUrl;
}
}
Binden Sie in Laravels Service -Container und rufen Sie es im Controller oder in der Aufgabe an:
// existieren AppServiceProvider Oder etwas Besonderes ServiceProvider Bindung in
$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));
});
// Reglerbeispiel
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);
}
}
In diesem Beispiel werden die Domainnamen in der Anforderung automatisch durch m66.net ersetzt.
Mit Curl_Share_init können wir mehrere Curl -Anfragen zur Freigabe von DNS -Auflösung- und Verbindungspool -Ressourcen aktivieren, wodurch die gleichzeitige Anfrage erheblich verbessert wird. In Kombination mit dem Abhängigkeitsinjektionsmechanismus von Laravel werden die gemeinsam genutzten Griffe in den Dienst eingekapselt, der einfach und effizient zu verwenden ist. Diese Methode eignet sich besonders für den häufigen Zugriff auf denselben Domänennamen oder die gleiche Schnittstelle.
Wenn Sie eine große Anzahl von gleichzeitigen Anforderungen an HTTP -Anforderungen in Ihrem Projekt haben, können Sie diesen Artikel auch versuchen, um die Leistung erheblich zu verbessern.