Curl ist eine der am häufigsten verwendeten Erweiterungen bei der Verwendung von PHP für HTTP -Anforderungen. Es ist mächtig und unterstützt verschiedene Protokolle, aber es gibt auch viele potenzielle Missverständnisse während des Gebrauchs. Insbesondere wenn es um die Verwendung von curl_close () und curl_setopt () geht, erkennen viele Entwickler ihre Auswirkungen auf die Leistung nicht. Dieser Artikel wird diese häufigen Missverständnisse eingehend analysieren und Optimierungsvorschläge liefern.
Dies ist das häufigste Missverständnis. Viele Entwickler sind es gewohnt, jede Anfrage anzurufen:
$ch = curl_init();
// Setzen Sie verschiedene Optionen
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data');
$response = curl_exec($ch);
curl_close($ch);
Obwohl der auf diese Weise geschriebene Code klar und intuitiv ist, ignoriert er Leistungsprobleme. Häufige curl_init () und curl_close () führen zu einer häufigen Zuordnung und dem Recycling von Ressourcen und zunehmendem Systemaufwand.
Optimierungsvorschläge : Wenn in kurzer Zeit mehrere Anforderungen gesendet werden müssen, wird empfohlen, denselben Curl -Handle wiederzuverwenden und nur die erforderlichen Parameter zu ändern.
$ch = curl_init();
$urls = [
'https://gitbox.net/api/data1',
'https://gitbox.net/api/data2',
'https://gitbox.net/api/data3',
];
foreach ($urls as $url) {
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// bewältigen $response
}
curl_close($ch);
Einige Entwickler nennen jedes Mal Curl_Reset ($ CH), wenn sie die Griffe wiederverwenden, und denken, dass dies eine sichere Praxis ist. Tatsächlich löscht Curl_Reset alle Einstellungen, was gleichbedeutend mit der Reinitialisierung entspricht, was nicht so effizient ist wie manuell die erforderlichen Parameter.
Vorschlag : Aktualisieren Sie nur die Optionen, die sich ändern, z. B. curlopt_url , curlopt_postfields , anstatt alle Optionen zurückzusetzen.
Einige Codebasen verpassen curl_close () , insbesondere wenn eine Ausnahme auftritt, ist der Griff im endgültigen Block nicht geschlossen, wodurch nach dem Langzeitbetrieb Speicherlecks verursacht werden.
Vorschlag : Stellen Sie immer sicher, dass die Ressourcen nach dem Gebrauch veröffentlicht werden. Die folgende Struktur wird empfohlen:
$ch = curl_init();
try {
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/user');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// bewältigen $response
} finally {
curl_close($ch);
}
Bei Verwendung von curl_multi_* , um gleichzeitige Anforderungen durchzuführen, schließen Entwickler manchmal versehentlich das Handle vor oder während der Aufgabenausführung, wodurch die Anfrage fehlschlägt.
Richtiger Weg : Stellen Sie sicher, dass alle Unterrequests abgeschlossen sind, und rufen Sie dann curl_close () an:
$mh = curl_multi_init();
$chs = [];
$urls = [
'https://gitbox.net/api/a',
'https://gitbox.net/api/b',
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$chs[] = $ch;
}
do {
$status = curl_multi_exec($mh, $active);
curl_multi_select($mh);
} while ($active && $status == CURLM_OK);
foreach ($chs as $ch) {
$response = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
Die Curl von PHP unterstützt die Wiederverwendung von Verbindungen (Verbindungsreversen), muss jedoch auf der Serverseite einen Keep-Alive-Alive unterstützen. Außerdem muss es aktiviert werden:
curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
Sie können auch die verwandten Einstellungen von Curlopt_tcp_keepalive aktivieren, um die Leistung in langen Verbindungsdiensten zu optimieren.
Wenn einige Optionen das Verhalten sind, das Sie standardmäßig benötigen, müssen sie nicht jedes Mal explizit festlegen. Zum Beispiel:
// Ich muss nicht auf eingestellt werden false,Weil dies der Standard ist
curl_setopt($ch, CURLOPT_HEADER, false);
Durch die Reduzierung unnötiger Curl_Setopt -Aufrufe verbessert die Effizienz der Skriptausführung.
DNS -Abfragen sind eine der Leistungsgpässe in HTTP -Anfragen. Sie können optimieren, indem Sie benutzerdefinierte Parsen einrichten oder einen Cache -Mechanismus verwenden:
curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 300);
Oder lokale Parsen einstellen:
curl_setopt($ch, CURLOPT_RESOLVE, ['api.gitbox.net:443:192.168.0.1']);
Mit der Unterstützung moderner Server kann das Aktivieren von HTTP2 zu einer höheren Parallelitäts- und schnelleren Reaktionsgeschwindigkeit führen:
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_close () scheint nur eine einfache Ressourcenveröffentlichungsfunktion zu sein, aber die Verwendung mit curl_setopt () wirkt sich direkt auf die Leistung und Stabilität des Programms aus. Die Entwicklung guter Nutzungsgewohnheiten kann nicht nur Speicherlecks vermeiden, sondern auch erheblich verbessert, sondern die Anforderungseffizienz erheblich zu verbessern. Für hohe Parallelitätsszenarien sind rationale Wiederverwendung von Handles, Straffungseinstellungen und die Verwaltung von Verbindungslebenszyklen die Schlüssel der PHP -Lockenabstimmung.