Curl est un outil très puissant lors de l'utilisation de PHP pour les demandes de réseau. Cependant, de nombreux développeurs rencontrent un problème commun lors du traitement de plusieurs demandes ou de la réutilisation des données:
Pour comprendre ce problème, nous devons commencer par le mécanisme interne et la gestion des ressources de Curl.
Curl utilise un mécanisme appelé "manche" pour maintenir le contexte de la demande. Lorsque nous appelons curl_init () , PHP créera une ressource, qui est la "poignée" utilisée pour construire la demande HTTP. Ensuite, utilisez curl_setopt () pour définir divers paramètres, et enfin exécuter la demande via curl_exec () .
Voici un processus de demande de boucle typique:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
Le but de curl_close () est de libérer des ressources créées précédemment via curl_init () . Cela signifie:
La connexion est fermée;
Tous les paramètres (y compris les URL, les en-têtes de demande, etc.) sont détruits;
Tous les tampons internes (y compris les corps de réponse) liés à la demande seront également nettoyés.
Par conséquent, une fois que vous avez appelé curl_close () , il équivaut à détruire complètement le contexte utilisé par la demande Curl. Même si vous avez déjà enregistré les variables de réponse, vous ne pourrez peut-être plus accéder à certaines données internes spécifiques (telles que les informations de transmission dans la poignée d'origine, etc.) car certaines ressources sont publiées.
Par exemple:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// Essayez maintenant d'obtenir les informations de demande
$info = curl_getinfo($ch); // Cela échouera,$ch Invalide
Dans l'exemple ci-dessus, Curl_getInfo () ne peut plus être utilisé car $ ch a été fermé et effacé.
Si vous devez conserver les données de réponse après la fermeture de la connexion, vous pouvez extraire les données requises avant de fermer la poignée. Par exemple:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/user/profile");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
// Maintenant $response et $info Tous sont en sécurité
Tant que vous extraire tout ce dont vous avez besoin avant Curl_close () , la fermeture de la connexion est tout à fait très bien.
Pour les demandes simultanées ou les scénarios haute performance, vous pouvez envisager d'utiliser Curl_Multi_Init () pour multiplexer plusieurs poignées, ou en utilisant la technologie de connexion persistante (Keep-Alive). PHP prend également en charge les clients HTTP tels que Guzzle, qui gèrent le multiplexage des connexions et la gestion des ressources plus intelligemment en interne.
Une fois que Curl_close () est appelé, tous les contextes et ressources de Curl seront libérés, ce qui est la cause profonde que vous ne pouvez plus transmettre ou récupérer les données demandées précédentes. L'approche correcte consiste à extraire le contenu de réponse requis ou à demander des informations avant de fermer la connexion. Comprendre le cycle de vie des ressources de Curl nous aide à l'utiliser plus en toute sécurité et plus efficacement pour la communication HTTP.