Я работаю над проектом, в котором веб-сервер Windows, работающий под управлением PHP, взаимодействует через очень медленное соединение с внутренним сервером Linux, на котором запущено приложение, написанное на C++. Поскольку соединение между двумя машинами очень медленное, я хотел бы сжать трафик, проходящий между ними.
Я добрался до того места, где я могу сжать строку, сохранить ее в файл, прочитать файл и распаковать строку в C++ с помощью Zlib, а также в PHP. Однако, если я попытаюсь сжать строку на одном языке и распаковать ее на другом (как это происходит в реальном мире), я получаю ошибки, свидетельствующие о том, что сжатые данные повреждены. Я также заметил, что одна и та же строка, сжатая в C++, приводит к другому файлу, чем в PHP, что наводит меня на мысль, что Zlib использует разные алгоритмы сжатия для каждого языка.
Я использую настройки по умолчанию для обеих сторон. С++, который я использую для сжатия и распаковки,
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 и распаковал его до просто «привет». Я предполагаю, что это означает, что я делаю что-то неправильно на стороне C++, что может объяснить, почему PHP недоволен распаковкой сжатых строк C++.
Редактировать 2: я попробовал пример программы zpipe.c, и он правильно распаковывает строки, сжатые PHP, и создает сжатые строки, которые PHP может распаковать. Очевидно, проблема(ы) существуют в моем коде C++. Либо я неправильно использую сжатие и распаковку, либо я неправильно читаю и записываю файл. Ни программы сжатия, ни программы распаковки корректно не взаимодействуют с zpipe.
Обновление: теперь я могу сжать строку с помощью PHP и прочитать ее с помощью PHP или C++, и я могу сжать строку с помощью C++ и прочитать ее с помощью C++, но пытаюсь прочитать это с PHP приводит к предупреждению PHP: gzuncompress(): ошибка данных. Что может быть другим, что может вызвать эту комбинацию рабочих/нерабочих сценариев?