curl_init / curl_setopt / curl_exec în PHP

cURL și email PHP 4.0.2+

Pregătește o cerere HTTP către alt server, de exemplu un API. Împreună cu curl_setopt și curl_exec, trimite cererea și primește răspunsul.

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

Ce face curl_init / curl_setopt / curl_exec

cURL este extensia PHP pentru comunicarea cu alte servere: apeluri API, trimiterea de formulare, descărcări. Lucrul se face în trei pași: curl_init creează cererea, curl_setopt setează câte o opțiune, iar curl_exec trimite cererea.

Cea mai importantă opțiune este CURLOPT_RETURNTRANSFER => true: fără ea, curl_exec afișează direct răspunsul în loc să îl returneze. Pentru POST setezi CURLOPT_POST și CURLOPT_POSTFIELDS, pentru antete CURLOPT_HTTPHEADER, iar pentru limita de timp CURLOPT_TIMEOUT.

Din PHP 8.0, cererea este un obiect CurlHandle eliberat automat. curl_close nu mai face nimic și este marcată ca învechită în PHP 8.5, deci nu mai e nevoie să o apelezi.

Parametri

Parametru Descriere
$url Opțional. Adresa cererii. Poate fi setată și mai târziu cu CURLOPT_URL.

Ce returnează

curl_init returnează un obiect CurlHandle (sau false). curl_exec returnează răspunsul ca text (cu CURLOPT_RETURNTRANSFER) sau false la eroare.

Exemple

Exemplul 1: Cerere GET către un API

Ultimele articole de pe dexblog.ro, prin API-ul REST al WordPress.

<?php
$ch = curl_init("https://www.dexblog.ro/wp-json/wp/v2/posts?per_page=3&_fields=id,title");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$raspuns = curl_exec($ch);
$articole = json_decode($raspuns, true);

foreach ($articole as $articol) {
    echo $articol["id"] . " - " . $articol["title"]["rendered"] . "\n";
}

Rezultat real (necesită conexiune la internet)

74938 - Cum afectează inteligența artificială schimbările climatice în 2026: Ghid complet
108818 - Cum să șterg contul Microsoft
106115 - Cele mai bune prompt-uri AI pentru crearea unui plan de mese săptămânal în 2026: Ghid complet

Exemplul 2: Cerere POST cu JSON

Serviciul de test httpbin.org trimite înapoi datele primite.

<?php
$ch = curl_init("https://httpbin.org/post");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(["nume" => "Ana", "oras" => "Iași"]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);

$raspuns = json_decode(curl_exec($ch), true);

echo "Cod HTTP: " . curl_getinfo($ch, CURLINFO_HTTP_CODE) . "\n";
print_r($raspuns["json"]);

Rezultat real (necesită conexiune la internet)

Cod HTTP: 200
Array
(
    [nume] => Ana
    [oras] => Iași
)

Greșeli frecvente

  • Uiți CURLOPT_RETURNTRANSFER. Răspunsul este afișat direct în pagină, iar curl_exec returnează doar true.
  • Nu setezi CURLOPT_TIMEOUT. Dacă serverul celălalt nu răspunde, scriptul tău așteaptă până la limita de execuție a PHP.
  • Dezactivezi verificarea certificatului cu CURLOPT_SSL_VERIFYPEER => false ca să scapi de o eroare SSL. Conexiunea devine vulnerabilă la interceptare. Repară certificatele CA ale serverului.

Comenzi înrudite

  • curl_setopt_array: Setează mai multe opțiuni cURL dintr-o dată, dintr-un tablou. Codul devine mai scurt și mai ușor de citit.
  • curl_error / curl_errno: Returnează mesajul ultimei erori cURL (domeniu inexistent, timp expirat, problemă SSL). curl_errno dă codul numeric.
  • json_decode: Transformă un text JSON în tablou sau obiect PHP.
  • http_build_query: Transformă un tablou în textul de interogare al unui URL (a=1&b=2), cu toate valorile codate corect.