Signatur
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
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);
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);
// 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_VERIFYPEERniemals auffalsegesetzt 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.