Работя по проект, при който уеб сървър на Windows, изпълняващ PHP, комуникира през много бавна връзка със сървър на Linux в задния край, изпълняващ приложение, написано на C++. Тъй като връзката между двете машини е толкова бавна, бих искал да компресирам трафика, движещ се между тях.
Стигнах дотам, че мога да компресирам низ, да го запазя във файл, да прочета файла и да декомпресирам низа в C++ с помощта на Zlib и по същия начин в PHP. Въпреки това, ако се опитам да компресирам низ на един език и да го декомпресирам на другия (както ще се случи в реалния свят), получавам грешки, че компресираните данни са повредени. Също така забелязах, че същият низ, компресиран в C++, води до различен файл, отколкото в PHP, което ме кара да вярвам, че Zlib използва различен алгоритъм за компресиране на всеки език.
Използвам настройките по подразбиране и от двете страни. C++, който използвам за компресиране и декомпресиране, е
compress((Bytef*)compressed, (uLongf*)&compressedLength, (Bytef*)uncompressed, (uLong)uncomressedLength);
uncompress((Bytef*)uncompressed, (uLongf*)&uncomressedLength, (Bytef*)compressed, (uLong)compressedLength);
докато PHP кодът е
$compressed = gzcompress($uncompressed);
$uncompressed = gzuncompress($compressed);
Защо това води до различни компресирани низове? Това ли е причината за проблемите с декомпресията? Какво трябва да направя, за да проработи това? Освен това не съм обвързан със Zlib. Zlib е това, което моето първоначално проучване разкри, но ако има по-добър начин да се направи това, аз съм целият в ушите.
Редактиране: Всъщност, след като направих още малко тестване, изглежда, че C++ работи с първоначалния ми тестов случай, но не универсално. Опитах го с въвеждането "hellohellohello" и при декомпресия, той отчете Z_DATA_ERROR и го декомпресира само до "hello". Предполагам, че това означава, че правя нещо нередно от страна на C++, което може да обясни защо PHP не е доволен от декомпресирането на C++ компресирани низове.
Редактиране 2: Изпробвах примерната програма zpipe.c и тя правилно декомпресира низове, компресирани от PHP, и създава компресирани низове, които PHP може да декомпресира. Ясно е, че проблемът(ите) съществуват в моя C++ код. Или използването на компресиране и декомпресиране е неправилно, или чета и записвам файла неправилно. Нито програмите за компресиране, нито за декомпресиране взаимодействат правилно с zpipe.
Актуализация: Вече стигнах до мястото, където мога да компресирам низ с помощта на PHP и да го прочета с PHP или C++, и мога да компресирам низ с C++ и да го прочета с C++, но се опитвам да прочета то с PHP води до PHP предупреждение: gzuncompress(): грешка в данните. Какво може да е различно, което би причинило тази комбинация от работещи/неработещи сценарии?