Pourquoi convertir cURL en PHP ?
Quand on développe une intégration avec une API tierce, la documentation fournit presque toujours des exemples sous forme de commandes cURL. C'est pratique pour tester dans un terminal, mais dès qu'il s'agit d'intégrer l'appel dans une application PHP, il faut traduire manuellement chaque option — méthode HTTP, en-têtes, corps de la requête, authentification, timeout, etc.
Cette traduction est répétitive et source d'erreurs : oublier CURLOPT_RETURNTRANSFER, mal gérer l'encodage du body JSON, confondre CURLOPT_POST et CURLOPT_CUSTOMREQUEST... Notre convertisseur automatise cette étape et génère un code PHP propre en un clic.
Anatomie d'une commande cURL
Avant de convertir, il est utile de comprendre ce que chaque flag cURL signifie :
| Option cURL | Rôle | Équivalent PHP |
|---|---|---|
-X POST | Méthode HTTP | CURLOPT_CUSTOMREQUEST |
-H 'Clé: Valeur' | En-tête HTTP | CURLOPT_HTTPHEADER |
-d '{...}' | Corps de la requête | CURLOPT_POSTFIELDS |
-u user:pass | Authentification Basic | CURLOPT_USERPWD |
-L | Suivre les redirections | CURLOPT_FOLLOWLOCATION |
-k | Ignorer le certificat SSL | CURLOPT_SSL_VERIFYPEER => false |
--max-time 30 | Timeout en secondes | CURLOPT_TIMEOUT |
-A 'Agent' | User-Agent | CURLOPT_USERAGENT |
-b 'cookie=val' | Cookies | CURLOPT_COOKIE |
--compressed | Décompression gzip | CURLOPT_ENCODING => '' |
Exemple 1 : requête GET avec en-tête d'authentification
Commande cURL
curl -X GET "https://api.exemple.com/users/42" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.TOKEN"
Code PHP cURL natif équivalent
<?php
$url = 'https://api.exemple.com/users/42';
$headers = [
'Accept: application/json',
'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.TOKEN',
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
throw new Exception('Erreur cURL : ' . curl_error($ch));
}
curl_close($ch);
$data = json_decode($response, true);
var_dump($data);
Notez l'utilisation de curl_setopt_array() plutôt que plusieurs appels curl_setopt() séparés : c'est plus lisible et marginalement plus performant.
Exemple 2 : requête POST avec un body JSON
C'est le cas le plus courant lors d'intégrations avec des APIs REST modernes (Stripe, SendGrid, OpenAI, etc.).
Commande cURL
curl -X POST "https://api.exemple.com/articles" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-d '{"titre": "Mon article", "publie": true}'
Code PHP cURL natif
<?php
$url = 'https://api.exemple.com/articles';
$body = json_encode([
'titre' => 'Mon article',
'publie' => true,
]);
$headers = [
'Content-Type: application/json',
'Authorization: Bearer TOKEN',
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
var_dump($data);
Avec Guzzle
<?php
require_once 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('POST', 'https://api.exemple.com/articles', [
'headers' => [
'Authorization' => 'Bearer TOKEN',
],
'json' => [
'titre' => 'Mon article',
'publie' => true,
],
]);
$data = json_decode($response->getBody()->getContents(), true);
var_dump($data);
L'option 'json' de Guzzle pose automatiquement le header Content-Type: application/json et sérialise le tableau PHP — aucun json_encode() manuel nécessaire.
Exemple 3 : formulaire POST (application/x-www-form-urlencoded)
Commande cURL
curl -X POST "https://exemple.com/login" \
-d "username=admin&password=secret123"
Code PHP
<?php
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://exemple.com/login',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => 'username=admin&password=secret123',
CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
]);
$response = curl_exec($ch);
curl_close($ch);
Si vous préférez passer un tableau associatif à CURLOPT_POSTFIELDS, PHP l'encodera automatiquement en multipart/form-data — différent du application/x-www-form-urlencoded. Pour forcer ce dernier format, passez toujours une chaîne de caractères.
Exemple 4 : authentification Basic (-u)
Commande cURL
curl -X GET "https://api.exemple.com/donnees" \
-u "utilisateur:motdepasse"
Code PHP
<?php
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.exemple.com/donnees',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_USERPWD => 'utilisateur:motdepasse',
]);
$response = curl_exec($ch);
curl_close($ch);
PHP traduit CURLOPT_USERPWD en header Authorization: Basic <base64> automatiquement. Vous pouvez aussi le faire manuellement avec base64_encode('user:pass') si vous préférez garder le contrôle explicite.
Bonnes pratiques PHP pour les requêtes HTTP
1. Toujours vérifier les erreurs cURL
<?php
$response = curl_exec($ch);
if (curl_errno($ch)) {
$erreur = curl_error($ch);
curl_close($ch);
throw new RuntimeException('Erreur cURL : ' . $erreur);
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 400) {
throw new RuntimeException("L'API a répondu avec le code HTTP $httpCode");
}
2. Ne jamais désactiver SSL en production
L'option -k (ou CURLOPT_SSL_VERIFYPEER => false) désactive la vérification du certificat SSL. Elle peut dépanner en développement local, mais elle ouvre la porte aux attaques man-in-the-middle en production. La bonne solution si vous avez des problèmes SSL est de mettre à jour le bundle de certificats CA :
<?php
// Bonne pratique : pointer vers le bundle CA à jour
curl_setopt($ch, CURLOPT_CAINFO, '/chemin/vers/cacert.pem');
3. Réutiliser les handles cURL
Si vous faites plusieurs requêtes vers le même serveur, réutiliser le handle avec curl_reset() est plus performant qu'un curl_init() à chaque fois — la connexion TCP/TLS peut être réutilisée grâce au keep-alive.
4. Gérer les timeouts
<?php
curl_setopt_array($ch, [
CURLOPT_TIMEOUT => 30, // timeout total en secondes
CURLOPT_CONNECTTIMEOUT => 10, // timeout de connexion seulement
]);
cURL natif vs Guzzle vs file_get_contents : lequel choisir ?
| Critère | cURL natif | Guzzle | file_get_contents |
|---|---|---|---|
| Dépendances | Extension PHP cURL | Composer + package | allow_url_fopen |
| API | Verbeux mais complet | Fluide et moderne | Minimaliste |
| Async | Non (curl_multi_exec) | Oui (Promises) | Non |
| Gestion erreurs | Manuelle | Exceptions automatiques | Basique |
| Middlewares | Non | Oui (retry, log, cache...) | Non |
| Idéal pour | Projets sans Composer | Projets modernes | Scripts simples |
Comment récupérer une commande cURL depuis votre navigateur
Vous pouvez exporter n'importe quelle requête HTTP faite par votre navigateur en commande cURL, ce qui est très utile pour déboguer ou reproduire un appel API :
- Ouvrez les DevTools (F12)
- Allez dans l'onglet Réseau (Network)
- Effectuez l'action qui déclenche la requête
- Clic droit sur la requête dans la liste → Copier → Copier en tant que cURL
- Collez la commande dans notre convertisseur cURL → PHP
Cette technique fonctionne dans Chrome, Firefox et Edge. Elle est particulièrement précieuse pour reproduire des appels authentifiés avec cookies ou tokens de session.
🎯 Convertissez vos commandes cURL maintenant !
Notre outil génère instantanément :
- ✅ PHP cURL natif (curl_init / curl_setopt_array)
- ✅ Guzzle HTTP (avec json, form_params, multipart)
- ✅ file_get_contents avec stream_context
- ✅ Détection automatique JSON, form-data, Basic Auth
Dernière mise à jour : Mars 2026 — Exemples testés avec PHP 8.2 et Guzzle 7.x.