Start · Sprachen · PHP · Referenz · curl_init

curl_init

Funktion

Initialisiert eine neue cURL-Session und gibt ein <code>CurlHandle</code>-Objekt zurück, das für weitere cURL-Funktionen verwendet wird.

seit PHP 4.0.2 Kategorie: http

Signatur

curl_init(string|null $url = null): CurlHandle|false

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

Typ
CurlHandle|false
Beschreibung
Gibt bei Erfolg ein 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);
Titel: delectus aut autem

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'];
HTTP-Status: 201 Neue ID: 101

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.';
}
Handle erfolgreich erstellt.

// 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.