Signatur
Beschreibung
curl_init() ist der Einstiegspunkt für alle cURL-Operationen in PHP. Die Funktion erstellt eine neue cURL-Session und gibt ein Handle zurück, das anschließend mit curl_setopt() konfiguriert, mit curl_exec() ausgeführt und schließlich mit curl_close() geschlossen werden sollte.
Optional kann direkt beim Initialisieren eine URL übergeben werden, was äquivalent zu einem nachgelagerten curl_setopt($ch, CURLOPT_URL, $url) ist. In der Praxis wird die URL jedoch häufig separat über curl_setopt() gesetzt, um den Code übersichtlicher zu halten.
Ab PHP 8.0 gibt curl_init() ein CurlHandle-Objekt zurück, anstatt wie zuvor eine Ressource. Bestehender Code, der das Handle lediglich weiterreicht, funktioniert weiterhin ohne Änderungen. Lediglich Prüfungen wie is_resource() müssen auf $ch instanceof CurlHandle angepasst werden.
cURL eignet sich besonders für HTTP-Anfragen an externe APIs, das Abrufen von Webseiten, Datei-Uploads via FTP oder das Senden von Daten mit verschiedenen Authentifizierungsmechanismen. Es bietet deutlich mehr Kontrolle als einfachere Alternativen wie file_get_contents() mit Stream-Kontext.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $url | string|null | null | Optionale URL, die für die cURL-Session voreingestellt wird. Entspricht dem nachträglichen Aufruf von curl_setopt($ch, CURLOPT_URL, $url). Wird null übergeben oder der Parameter weggelassen, muss die URL später über curl_setopt() gesetzt werden. |
Rückgabewert
CurlHandle-Objekt zurück (vor PHP 8.0 eine Ressource vom Typ curl). Im Fehlerfall wird false zurückgegeben.Beispiele
Einfache GET-Anfrage an eine REST-API
<?php
$ch = curl_init('https://jsonplaceholder.typicode.com/todos/1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: application/json']);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL-Fehler: ' . curl_error($ch);
} else {
$data = json_decode($response, true);
echo 'Titel: ' . $data['title'];
}
curl_close($ch);
POST-Anfrage mit JSON-Body
<?php
$payload = json_encode([
'title' => 'Neuer Eintrag',
'body' => 'Inhalt des Eintrags',
'userId' => 1,
]);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://jsonplaceholder.typicode.com/posts',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Content-Length: ' . strlen($payload),
],
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo 'HTTP-Status: ' . $httpCode . PHP_EOL;
$result = json_decode($response, true);
echo 'Neue ID: ' . $result['id'];
Handle-Typ ab PHP 8.0 prüfen
<?php
$ch = curl_init('https://example.com');
// Vor PHP 8.0: is_resource($ch)
// Ab PHP 8.0:
if ($ch instanceof CurlHandle) {
echo 'Handle erfolgreich erstellt.';
curl_close($ch);
} else {
echo 'Fehler beim Initialisieren der cURL-Session.';
}
// Wichtig · Fallstricke
Sicherheit: Werden URLs dynamisch aus Benutzereingaben übernommen, besteht die Gefahr von Server-Side Request Forgery (SSRF). Interne Dienste, Metadaten-Endpunkte (z. B. 169.254.169.254 in Cloud-Umgebungen) oder das lokale Dateisystem könnten so unerwartet abgerufen werden. URLs sollten stets gegen eine Whitelist erlaubter Hosts validiert werden.
SSL-Zertifikatsprüfung: Die Optionen CURLOPT_SSL_VERIFYPEER und CURLOPT_SSL_VERIFYHOST sollten niemals auf false gesetzt werden, da dies Man-in-the-Middle-Angriffe ermöglicht. Stattdessen sollte ein aktuelles CA-Bundle (z. B. via CURLOPT_CAINFO) bereitgestellt werden.
Ressourcen-Management: Jedes mit curl_init() erzeugte Handle sollte nach Verwendung mit curl_close() freigegeben werden, um Speicherlecks zu vermeiden. Für mehrere gleichzeitige Anfragen empfiehlt sich curl_multi_init().
PHP 8.0+: Das Handle ist nun ein CurlHandle-Objekt; is_resource()-Prüfungen geben false zurück und müssen auf instanceof CurlHandle umgestellt werden.