2010-10-28 4 views
0

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?

+0

Ce n'est pas le C++ que vous utilisez pour le (dé) compression, c'est juste les déclarations de fonction. –

+0

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. –

+0

Pourriez-vous de publier votre code, correctement mise à jour. Merci. – cedivad

Répondre

1

Le niveau de compression par défaut de Zlib est 6 - vous pouvez essayer de le passer comme deuxième paramètre sur gzcompress for PHP.

string gzcompress (string $data [, int $level = -1 ]) 

De l'ZLIB manual:

Le niveau de compression doit être Z_DEFAULT_COMPRESSION, ou entre 0 et 9: 1 donne la meilleure vitesse, 9 donne meilleure compression, 0 donne aucune compression du tout (les données d'entrée sont simplement copiées un bloc à la fois). Z_DEFAULT_COMPRESSION demande un compromis par défaut entre vitesse et compression (actuellement équivalent à niveau 6)

+0

Vous pouvez également vous assurer que les autres paramètres, et peut-être les versions de la bibliothèque, sont identiques ou compatibles. – ssube

+0

Changer le niveau de compression ne semble pas avoir d'impact sur le côté PHP. Cela fonctionne quel que soit le niveau que j'ai défini. La décompression incorrecte du côté C++ est différente si je change le niveau de compression, mais pour au moins 0, 6 et 9, c'est toujours faux. –

+0

Bizarre. J'ai dû faire fonctionner ZLIB avec C++, C# et Java, et même si les fichiers étaient différents, uncompress fonctionne toujours. Y a-t-il une opération de vidage de flux ou de fichier que vous ne faites pas à chaque extrémité? –

Questions connexes