Start · Sprachen · PHP · Referenz · curl_exec

curl_exec

Funktion

Führt eine zuvor mit <code>curl_init()</code> und <code>curl_setopt()</code> konfigurierte cURL-Session aus und überträgt die Anfrage.

seit PHP 4.0.2 Kategorie: http

Signatur

curl_exec(CurlHandle $handle): string|bool

Beschreibung

curl_exec() führt die über das übergebene cURL-Handle konfigurierte HTTP-Anfrage (oder eine andere unterstützte Protokollanfrage) aus. Die Funktion ist das eigentliche Herzstück jeder cURL-Interaktion: Erst nach ihrem Aufruf wird die Netzwerkverbindung hergestellt und Daten übertragen.

Standardmäßig gibt die Funktion den Rückgabewert der Anfrage direkt aus (echot ihn), sofern die Option CURLOPT_RETURNTRANSFER nicht auf true gesetzt ist. In der Praxis sollte CURLOPT_RETURNTRANSFER fast immer aktiviert werden, damit das Ergebnis als String zurückgegeben und weiterverarbeitet werden kann.

Bei einem Fehler gibt die Funktion false zurück. Dabei ist zu beachten, dass ein HTTP-Fehler-Statuscode (z. B. 404 oder 500) kein cURL-Fehler ist und daher nicht zu false führt – der HTTP-Statuscode muss separat über curl_getinfo() geprüft werden. Tatsächliche Fehler (z. B. DNS-Auflösung fehlgeschlagen, Timeout) lassen sich mit curl_error() und curl_errno() diagnostizieren.

curl_exec() kann für beliebige von libcurl unterstützte Protokolle verwendet werden, darunter HTTP, HTTPS, FTP, FTPS und mehr. Es ist sinnvoll einsetzbar für REST-API-Aufrufe, Dateidownloads, Formular-Submits und viele weitere Netzwerkaufgaben.

Parameter

Name Typ Default Beschreibung
$handle Pflicht CurlHandle Ein gültiges cURL-Handle, das zuvor mit curl_init() erstellt und mit curl_setopt() konfiguriert wurde.

Rückgabewert

Typ
string|bool
Beschreibung
Gibt bei Erfolg true zurück, oder den Antwort-String, wenn CURLOPT_RETURNTRANSFER gesetzt ist. Gibt false zurück, wenn ein cURL-Fehler aufgetreten ist (z. B. Verbindungs- oder Timeout-Fehler). Ein HTTP-Fehlerstatuscode allein führt nicht zu false.

Beispiele

Einfache GET-Anfrage mit Rückgabe als String

<?php
$ch = curl_init('https://httpbin.org/get');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$response = curl_exec($ch);

if ($response === false) {
    echo 'cURL-Fehler: ' . curl_error($ch);
} else {
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo 'HTTP-Statuscode: ' . $httpCode . PHP_EOL;
    echo 'Antwort: ' . $response;
}

curl_close($ch);
HTTP-Statuscode: 200 Antwort: {"args": {}, "headers": {...}, ...}

POST-Anfrage an eine REST-API

<?php
$payload = json_encode([
    'name'  => 'Max Mustermann',
    'email' => 'max@example.com',
]);

$ch = curl_init('https://httpbin.org/post');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'Content-Length: ' . strlen($payload),
    ],
    CURLOPT_TIMEOUT        => 15,
]);

$response = curl_exec($ch);

if ($response === false) {
    throw new RuntimeException('cURL-Fehler: ' . curl_error($ch));
}

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode !== 200) {
    throw new RuntimeException('Unerwarteter HTTP-Statuscode: ' . $httpCode);
}

$data = json_decode($response, true);
echo 'Gesendete Daten: ' . print_r($data['json'], true);
Gesendete Daten: Array ( [email] => max@example.com [name] => Max Mustermann )

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Werden URLs dynamisch aus Benutzereingaben zusammengesetzt, muss die URL stets validiert und ggf. mit filter_var($url, FILTER_VALIDATE_URL) geprüft werden, um Server-Side Request Forgery (SSRF) zu verhindern.
  • Bei HTTPS-Verbindungen sollte CURLOPT_SSL_VERIFYPEER niemals auf false gesetzt werden, da sonst Man-in-the-Middle-Angriffe möglich sind. Stattdessen sollte ein aktuelles CA-Zertifikat-Bundle hinterlegt werden.
  • Timeouts (CURLOPT_TIMEOUT, CURLOPT_CONNECTTIMEOUT) sollten immer gesetzt werden, um das Hängen von Skripten bei langsamen oder nicht erreichbaren Servern zu vermeiden.

Häufiger Fallstrick: curl_exec() gibt false nur bei einem echten cURL-Fehler zurück. Ein HTTP-404 oder HTTP-500 ist kein cURL-Fehler – der Statuscode muss mit curl_getinfo($ch, CURLINFO_HTTP_CODE) explizit geprüft werden.

Hinweis zu PHP 8.0+: Ab PHP 8.0 gibt curl_init() ein CurlHandle-Objekt zurück (statt einer resource). Das Verhalten von curl_exec() selbst ändert sich dadurch nicht.