Maison  >  Article  >  développement back-end  >  php curl gzip caractères tronqués

php curl gzip caractères tronqués

WBOY
WBOYoriginal
2023-05-06 21:21:091098parcourir

Ces dernières années, avec le développement d'Internet, l'utilisation des services Web s'est accrue. Parmi eux, PHP, en tant que langage de programmation open source populaire, est largement utilisé dans le domaine du développement Web et est devenu le langage le plus fréquemment utilisé. Dans le développement PHP, il est courant d'utiliser la bibliothèque cURL pour envoyer des requêtes HTTP et recevoir des réponses HTTP. Dans le même temps, pour la plupart des réponses HTTP, le serveur permettra à l'algorithme de compression gzip de compresser la réponse, économisant ainsi la bande passante et le temps de transmission du réseau et améliorant les performances des applications Web. Cependant, lorsque vous utilisez PHP curl pour effectuer une requête HTTP, si le corps de la réponse renvoyé est compressé au gzip, des caractères tronqués peuvent apparaître. Cet article se concentrera sur la façon de résoudre le problème des caractères tronqués renvoyés par gzip dans PHP curl.

1. Algorithme de compression Gzip

L'algorithme de compression gzip est un algorithme de compression sans perte qui est souvent utilisé pour compresser des fichiers de ressources Web tels que des fichiers HTML, CSS et JavaScript. Il compresse ces fichiers lorsqu'ils sont stockés et transmis, éliminant ainsi une grande quantité de données redondantes lors de la transmission de fichiers sur le Web et réduisant les besoins en matière de temps de transmission et de bande passante. Les navigateurs Web et les serveurs prennent en charge la compression gzip, car gzip est désormais devenu un standard pour le protocole HTTP/1.1, ce qui améliore considérablement les performances des applications Web.

Le principe de l'algorithme de compression gzip est d'utiliser le codage de Huffman pour convertir chaque fichier dans l'encodage binaire correspondant lors de sa compression individuellement. Le codage de Huffman est un codage de longueur variable qui utilise différentes tables de codage en fonction de différents objets de compression. Pour des séquences de caractères de même longueur, la compression utilisant le codage Huffman nécessite moins d'espace de stockage que le codage utilisant une longueur de mot fixe, ce qui est l'une des raisons pour lesquelles l'algorithme de compression gzip est efficace. Dans le fichier compressé, à l'exception du premier octet comme identifiant, les octets restants sont générés via le codage de Huffman.

II, compression gzip en PHP curl

PHP fournit la bibliothèque curl pour la communication réseau. Utilisez la bibliothèque curl pour envoyer des requêtes HTTP et recevoir des réponses HTTP. Lors de l'envoi d'une requête HTTP, vous devez configurer les paramètres pertinents de la bibliothèque curl, tels que l'URL demandée, la méthode de requête et les en-têtes de requête. Lors de la réception d'une réponse HTTP, la bibliothèque curl décompressera automatiquement le corps de la réponse au format gzip par défaut. Habituellement, les développeurs PHP peuvent appeler la fonction curl_setopt() pour configurer les paramètres de la requête et définir CURLOPT_ENCODING sur gzip pour prendre en charge les réponses au format gzip via curl.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/path/to/api");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
$response = curl_exec($ch);
curl_close($ch);
echo $response;

III rencontré dans le problème PHP curl.

Lors de l'utilisation de la bibliothèque PHP curl, nous rencontrons souvent le problème que certaines réponses HTTP sont compressées avec gzip et que des caractères chinois tronqués apparaissent toujours après la décompression. La raison de ce type de caractères chinois tronqués est qu'il existe des caractères codés Unicode dans les fichiers compressés par le serveur et que la bibliothèque curl ne gère pas correctement ces caractères codés Unicode par défaut, provoquant des erreurs dans le processus de décompression et de restauration. les fichiers compressés.

Par exemple, voici la réponse à une requête HTTP :

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Content -Longueur : 135

H4sIAAAAAAAAAAG3QwQ2DMBDH8fc8D2l1p7hAUEiyklH6eAINu6cZm3jKDyL4ItZAN1RSxVVWUKpN
wIU8qf1Jc4S2uK4Wq5674tLLasa5BtU4mSivZkR5tb6637HP+ NzJjvY +

�jko?t[��_mK”�Ix۱�E�U�c��">W��6

Ce corps de réponse contient des caractères tronqués. En effet, le corps de la réponse utilise la compression gzip et contient des caractères codés en UTF-8. Afin de décompresser et restaurer correctement ce corps de réponse, une certaine configuration est requise dans la bibliothèque PHP curl.

IV. Solution

1. Utilisez gzdecode pour décompresser

La fonction PHP gzdecode() est une méthode de décompression des fichiers au format gzip Vous pouvez l'utiliser pour décompresser directement le fichier gzip renvoyé par la requête curl pour obtenir le bon document.

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://example.com/path/to/api");

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
$response = curl_exec($ch);
curl_close($ch);
echo gzdecode($response);

2. Transcodage

Une autre façon de résoudre le problème des caractères chinois tronqués consiste à utiliser la fonction iconv de PHP. Avant que la fonction ne soit exécutée, vous devez intercepter l'espace occupé par les deux premiers octets du fichier compressé en appelant la fonction de chaîne substr(), puis utiliser la fonction iconv pour convertir la chaîne afin d'obtenir les caractères chinois corrects.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/path/to/api");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
$response = curl_exec($ch);
curl_close($ch);
$response = substr($response, 10); Utilisez le format gzip pour compresser les 10 premiers octets du fichier
$response = iconv('UTF-8', 'GBK//IGNORE', $response);
echo $response;

Résumé

Utilisation de la bibliothèque PHP curl pour HTTP Lors de la demande et de la réponse, vous devez noter que le serveur peut activer l'algorithme de compression Gzip pour réduire la quantité de transmission de données et améliorer les performances des applications Web. Cependant, lorsque vous utilisez la bibliothèque PHP curl, vous pouvez rencontrer le problème des caractères chinois tronqués, qui devrait être résolu à temps. Il existe de nombreuses façons de résoudre les caractères chinois tronqués, comme utiliser gzdecode pour décompresser, utiliser la fonction iconv pour transcoder, etc. Dans le développement réel, vous pouvez choisir la méthode appropriée pour résoudre le problème des caractères chinois tronqués en fonction de vos propres besoins et des conditions réelles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn