Je travaille sur un projet où un serveur web Windows exécutant PHP communique sur une connexion très lente avec un serveur Linux back-end exécutant une application écrite en C++. Parce que la connexion entre les deux machines est si lente, j'aimerais compresser le trafic qui les sépare.Déplacement de chaînes compressées entre C++ et PHP avec zlib
Je suis arrivé à l'endroit où je peux compresser une chaîne, l'enregistrer dans un fichier, lire le fichier, et décompresser la chaîne en C++ en utilisant Zlib, et de même en PHP. Cependant, si j'essaie de compresser une chaîne dans une langue et de la décompresser dans l'autre (comme cela se passera dans le monde réel), je reçois des erreurs qui me font croire que les données compressées sont corrompues. J'ai aussi remarqué que la même chaîne compressée en C++ aboutit à un fichier différent de celui de PHP, ce qui me porte à croire que Zlib utilise un algorithme de compression différent sur chaque langue. J'utilise les paramètres par défaut des deux côtés. Le C++ J'utilise pour faire la compression et la décompression est
compress((Bytef*)compressed, (uLongf*)&compressedLength, (Bytef*)uncompressed, (uLong)uncomressedLength);
uncompress((Bytef*)uncompressed, (uLongf*)&uncomressedLength, (Bytef*)compressed, (uLong)compressedLength);
alors que le code PHP est
$compressed = gzcompress($uncompressed);
$uncompressed = gzuncompress($compressed);
Pourquoi ces différentes entraînant des chaînes compressées? Est-ce ce qui cause les problèmes de décompression? Que devrais-je faire pour que cela fonctionne? En outre, je ne suis pas commis à Zlib. Zlib est ce que ma recherche initiale a découvert, mais s'il y a une meilleure façon de le faire, je suis tout ouïe.
Modifier: En fait, après avoir fait un peu plus de tests, il semble que C++ fonctionnait avec mon cas de test initial, mais pas universellement. Je l'ai essayé avec l'entrée "hellohellohello", et lors de la décompression, il a rapporté un Z_DATA_ERROR et l'a décompressé en "bonjour". Je suppose que cela signifie que je fais quelque chose de mal du côté C++, ce qui peut expliquer pourquoi PHP n'est pas content de décompresser des chaînes compressées en C++.
Édition 2: J'ai essayé le programme exemple zpipe.c, et il décompresse correctement les chaînes compressées par PHP et produit des chaînes compressées que PHP peut décompresser. Clairement, le (s) problème (s) existent dans mon code C++. Soit mon utilisation de compresser et décompresser est incorrecte, ou je lis et écris le fichier de façon incorrecte. Ni les programmes de compression ou de décompression interagissent correctement avec zpipe.
Mise à jour: Je suis maintenant arrivé à l'endroit où je peux compresser une chaîne en utilisant PHP et le lire soit avec PHP ou C++, et je peux compresser une chaîne avec C++ et le lire avec C++, mais en essayant de le lire avec les résultats de PHP en PHP Attention: gzuncompress(): erreur de données. Qu'est-ce qui pourrait être différent et causer cette combinaison de scénarios de travail/non-travail?
Ce n'est pas le C++ que vous utilisez pour le (dé) compression, c'est juste les déclarations de fonction. –
Ce sont des appels de bibliothèque. compressed, compressedLength, etc. sont les noms réels des variables que j'utilise, et puisque Zlib utilise ses propres types plutôt que des types standard, je les lance quand je fais l'appel. –
Pourriez-vous de publier votre code, correctement mise à jour. Merci. – cedivad