![]() |
PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Hallo,
ich will über php einen String komprimieren
Delphi-Quellcode:
und über delphi dekomprimieren:
$compressed = gzcompress($s, 9);
echo $compressed ;
Delphi-Quellcode:
Problem: Meldung 'data error' beim Aufruf ZDecompressStr ( );
ls := idhttp1.Put(
'http://127.0.0.1/.....php?bef='+ in_s_SQL , nil ); ld := ZDecompressStr ( @ls ); Woran kann es liegen ? |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Bist du sicher das Put etwas zurückliefert ?
![]() Rollo |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Ohne Komprimierung läuft auch alles optimal. Jetzt will ich halt noch die Übertragung optimieren. Kann es sein, dass die Algorithmen von PHP und Delphi nicht zusammen passen ? |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
![]() Sorr^, der Link lässt sich nicht gut kopieren. Aber muss nicht der Stream als 2. Parameter da rein ? Rollo |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Ich übergebe einen SQL-Befehl als HTML-Parameter. Die Rückgabe klappt auch super, wenn ich nicht komprimiere. Wenn ich komprimiere kommt auch eine Antwort, mit einem String der nur ca 1/10 lang ist. Beim Dekomprimieren kommt dann das Problem. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Nur so eine Vermutung
Transliterationsprobleme Da wir weder die Delphi Version kennen noch den Typ derLS Variable Vermute ich das der Rückgabewerte durch die Übergabe an die Variable in einen andere Darstellung konvertiert wird. Ansi UTF8 Widestring und. Versuche es mit ein Memorystream Möglichkeit 2 du verwendest Pascal Strings die haben vorne 1 bis 2 Byte Längen Information und dein @ls im decompress faengt mit den falschen Bytes an ![]() Mfg Hannes |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Die Indy TIdHTTP Komponente kann auch von Haus aus GZIP dekomprimieren, dazu muss einfach eiine TIdCompressorZLib Komponente erzeugt und der TIdHTTP.Compressor Property zugewiesen werden. Fundstelle: http://stackoverflow.com/a/8597492/80901
|
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
ls : string; Danke für die Tips, es haut immer noch nicht hin. Vielleicht hat der eine oder andere das auch mal umgesetzt. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Was wird denn gesendet?
wenn ein Ansistring geliefert wird wird er wenn er in LS abgespeichert wird in einen WIdestring (also 16 Bit/Char) umgebaut und die Binäre Codierung ist hinüber mfg Hannes |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
ls=idhttp1.Put( l_url , nil );
liefert System.string Vielleicht kann das mal noch jemand testen. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
weitere Versuche:
bleibt in einer Endlosschleife hängen:
Delphi-Quellcode:
bringt Data Error
idhttp1.Get( l_url , l_in_Stream );
ZDecompressStream(l_in_Stream, l_out_Stream );
Delphi-Quellcode:
Diese Variante bleibt auch hängen :
idhttp1.Get( l_url , l_in_Stream );
GZDecompressStream(l_in_Stream, l_out_Stream ); ![]()
Delphi-Quellcode:
hier kommt die Meldung "Dekomprimierungsfehler":
idhttp1.Intercept:= self.IdCompressionIntercept1;
ls := idhttp1.Put( l_url , nil );
Delphi-Quellcode:
Anmerkung: wenn ich nicht zippe, kann ich auch über den Stream die Daten richtig empfangen
idhttp1.Intercept:= self.IdCompressionIntercept1;
idhttp1.Get( l_url , l_in_Stream ); und darstellen. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
mjustin hat es schon angedeutet. Eine andere Möglichkeit wäre es, die in HTTP eingebaute Übertragungskompression zu verwenden.
Dazu musst du deinen Webserver entsprechend einrichten. Oft ist er das auch schon. Falls nicht kann ich dir dabei helfen. Außerdem musst du im Client die Kompression aktivieren. Technisch betrachtet sendet der Client einen HTTP Header mit (Accept-Encoding: gzip, deflate). Der Server antwortet dann, wenn er gzip unterstützt, mit einem weiteren Header (Content-Encoding: gzip). Der Content-Type Header bleibt unverändert. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Wie viele MB hat denn der String, den du übertragen willst, dass man ihn komprimieren muss?
|
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Es läuft super. Mit Komprimierung könnte ich hat das Volumen über das Netz deutlich reduzieren. Die Tabelle mit der ich getestet habe, hatte 0,3 MB. Es kommen natürlich auch noch größere. Allerdings kann man dann ja die Menge über Limit x,y einteilen. Mich interessiert es mal generell, wie man diese Kopplung PHP-Delphi über die Komprimierung hinbekommt. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Über
Delphi-Quellcode:
kann ich auch alle php-Ausgaben automatisch zippen.
<?php ob_start("ob_gzhandler");?>
Das Problem ist nun die Dekompression über Indy. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Aber wenn das nicht funktioniert, kann ich dir empfehlen den dafür vorgesehenen Weg über den Webserver und -Browser zu verwenden. Dein Webserver kann das bereits. Und das aus gutem Grund. Benutz es doch, wenn er es kann. Dafür ist es da. Und ich vermute dass es damit einfacher funktioniert. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Und dazu muss ich ja die Daten über diese Indy-Komponente holen, was auch funktioniert. Nur wie kann ich sie nun entpacken ? Hätte nicht gedacht, dass es ein Problem ist. Umgekehrt zippe ich meine Daten auch vor dem Upload mit Delphi, und PHP kann sie problemlos auspacken. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Uff.
Also, nochmal. Du kannst das deinen Webserver machen lassen. Der kann bereits gzip und macht genau das was du da vorhast. Nur dass du dir den Code sparst und die Probleme die du damit (offensichtlich!) hast auch. Schau dir mjustins Beitrag an, wie man das in der TIdHTTP Komponente einstellt. Die allermeisten Webserver haben Gzip in ihrer Standardkonfiguration bereits aktiviert. Falls das bei deinem nicht der Fall ist, kann man das aber einfach aktivieren. (Und dabei ist es egal ob Browser oder Indy HTTP Client. Der Transportweg HTTP hat Gzip Komprimierung eingebaut und das kannst du nutzen, wenn es manuell über deine Anwendungsdaten nicht so einfach funktioniert.) |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
das mit dem Zippen funktioniert doch auf der Serverseite
Das Problem liegt doch bei IdHTTP1: TIdHTTP; in meiner Delphi-FMX-Anwendung |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Diese Variante bleibt auch hängen : Quelle: ![]()
Delphi-Quellcode:
hier kommt die Meldung "Dekomprimierungsfehler":
idhttp1.Intercept:= self.IdCompressionIntercept1;
ls := idhttp1.Put( l_url , nil );
Delphi-Quellcode:
Vielleicht klappt es bei Dir und Du kannst mir nen Tip geben.
idhttp1.Intercept:= self.IdCompressionIntercept1;
idhttp1.Get( l_url , l_in_Stream ); |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Zitat:
Anschließend ist die Kompression völlig transparent und ohne eine einzige Zeile Code. Klingt das nicht erstrebenswert? Und um das zu überprüfen (weils ja transparent ist) kann man sich noch Wireshark oder ähnliche Tools zu Hilfe nehmen. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
![]() The code below should be added to your .htaccess file... <ifModule mod_gzip.c> mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude mime ^image/.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* </ifModule> Das hab ich jetzt mal ausgeführt. Mal sehen, was passiert. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
@Valle
Danke erstmal für die Tips. Ich teste mit einem xampp Apache server Version 2.4.10 Ich habe jetzt mal eine .htaccess Datei mit obigem im htdocs-Verzeichnis angelegt. Wireshark scheint Probleme mit meiner Firwall zu haben. Daher habe ich jetzt mal folgenden Test über curl.exe gemacht: C:\Programme\curl>curl -I -H 'Accept-Encoding: gzip,deflate' http ://localhost curl: (6) Could not resolve host: gzip,deflate' HTTP/1.1 302 Found Date: Sun, 29 May 2016 08:39:20 GMT Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 X-Powered-By: PHP/5.6.3 Location: ![]() Content-Type: text/html; charset=UTF-8 'Could not resolve host: gzip,deflate' bedeutet ja, dass die Komprimierung nicht aktiv ist. Was muss ich noch berücksichtigen ? |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Ich würde eher sagen, dass er den Host nicht gefunden hat, bzw. dessen IP Adresse nicht auflösen konnte.
|
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
HTTP/1.1 302 Found Date: Sun, 29 May 2016 08:39:20 GMT Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 X-Powered-By: PHP/5.6.3 Location: ![]() Content-Type: text/html; charset=UTF-8 nur nicht die Dekomprimierung Die Frage ist, ob es reicht, wenn ich diese .htaccess-Datei in /htdocs speichere. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
weiterer Test: auch noch kein Erfolg
![]() .htaccess: <IfModule mod_deflate.c> # Compress HTML, CSS, JavaScript, Text, XML and fonts AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml # Remove browser bugs (only needed for really old browsers) BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html Header append Vary User-Agent </IfModule> |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Ich bin mir ziemlich sicher dass Xampp bereits Gzip aktiviert hat. Wenn am Ende alles funktioniert, dann entferne deine .htaccess nochmal und schau ob es immer noch geht, damit du nicht unnötiges Zeug mit dir rumträgst.
Was deine "Could not resolve host" Fehlermeldung angeht: Hinter der Fehlermeldung steht dein Header, er hat also versucht den HTTP Header als Host aufzulösen, was natürlich nicht funktioniert. Das beudetet, dass du ein Syntax Problem in deinem Befehl hast. Ich sehe da auch ein Leerzeichen wo keins hingehört, also schau nochmal genau hin. Wenn du CURL erfolgreich ausgeführt hast, dann muss in der Ausgabe auch der Header "Content-Encoding: gzip" aufauchen. Wichtig ist außerdem, dass du den richtigen Pfad aufrufst. Du hast jetzt nur auf "/" zugegriffen, was unter Xampp zu einer Weiterleitung führt. Gib doch bitte die richtige URL ein, damit auch der richtige Content geladen wird. Eine Weiterleitung hat oft keinen Content und wird daher auch nicht komprimiert. Ansonsten kann ich dir nochmals empfehlen Wireshark oder ein ähnliches Programm dafür zu verwenden. Denn hier testest du zwar deinen Webserver, was schonmal gut ist, aber du testest nicht, ob es auch mit deinem Client funktioniert. Schalte die Firewall dafür eben ab (über die Notwendigkeit einer Personal Firewall kann man sowieso streiten...). Falls Wireshark zu kompliziert ist, habe ich glaub ich mal was von einem HTTP Analyzer in diesem Forum gehört. Lässt sich leicht über Google finden. Ich bin mir aber nicht sicher ob es wirklich der war, daher keine Garantie auf Vertrauenswürdigkeit! Update: So funktioniert das bei mir, unter Linux:
Code:
valentin@t460s ~ $ curl -I -H "Accept-Encoding: gzip,deflate" http://www.heise.de/
HTTP/1.1 200 OK Server: nginx Content-Type: text/html; charset=utf-8 Content-Encoding: gzip X-Cobbler: octo01.heise.de X-Clacks-Overhead: GNU Terry Pratchett Last-Modified: Sun, 29 May 2016 09:35:17 GMT Expires: Sun, 29 May 2016 09:35:49 GMT Cache-Control: public, max-age=32 Content-Length: 47452 Accept-Ranges: bytes Date: Sun, 29 May 2016 09:35:37 GMT Age: 20 Connection: keep-alive Vary: User-Agent,Accept-Encoding,X-Forwarded-Proto,X-Export-Format,X-Export-Agent |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Hi,
hab jetzt das Leerzeichen nach dem : entfernt. Jetzt sieht es so aus: Die Meldung 'could not resolve Host' weg C:\Programme\curl>curl -I -H 'Accept-Encoding:gzip,deflate' ![]() HTTP/1.1 302 Found Date: Sun, 29 May 2016 09:40:54 GMT Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 X-Powered-By: PHP/5.6.3 Location: ![]() Content-Type: text/html; charset=UTF-8 |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Genau. Und jetzt lies noch den Rest meines Posts.
Du musst den richtigen Pfad aufrufen. Dort wo du Curl jetzt hinschickst, ist nix, was komprimiert werden könnte. Update:
Code:
curl -X PUT -I -H "Accept-Encoding: gzip,deflate" "http://127.0.0.1/.....php?bef=SELECT..."
|
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
wo sollte Deiner Meinung nach ein Blank zu viel sein ?
hier ist ein ähnliches Bsp: ![]() |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
ich hab das jetzt mal mit einer Standarddatei applications.html gemacht:
sie ist 1,40 KB (1.441 Bytes) lang. Es sieht demnach nicht nach Komprimierung aus: Weder mit noch ohne der .htaccess-Datei C:\Programme\curl>curl -I -H 'Accept-Encoding:gzip,deflate' ![]() HTTP/1.1 200 OK Date: Sun, 29 May 2016 09:59:03 GMT Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 Last-Modified: Wed, 12 Nov 2014 15:49:59 GMT ETag: "5a1-507ab591677c0" Accept-Ranges: bytes Content-Length: 1441 Content-Type: text/html |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
ich hab jetzt mal Deine Seite bei heise.de getestet:
Man sieht: es wird gezippt und das Blank hinter Encodeing: stört auch nicht: C:\Programme\curl> curl -I -H "Accept-Encoding: gzip,deflate" ![]() HTTP/1.1 200 OK Server: nginx Content-Type: text/html; charset=utf-8 Content-Encoding: gzip X-Cobbler: octo02.heise.de X-Clacks-Overhead: GNU Terry Pratchett Last-Modified: Sun, 29 May 2016 10:09:20 GMT Expires: Sun, 29 May 2016 10:09:52 GMT Cache-Control: public, max-age=32 Content-Length: 47236 Accept-Ranges: bytes Date: Sun, 29 May 2016 10:09:27 GMT Age: 7 Connection: keep-alive Vary: User-Agent,Accept-Encoding,X-Forwarded-Proto,X-Export-Format,X-Export-Agent Bei meinem Xampp-Apache ist also kein Gzip aktiv - und warum die host-Fehlermeldung ? |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Dann ist das Gzip-Modul wohl doch nicht geladen.
Schau mal hier: ![]() Wenn du Änderung an der Apache Config machst, musst du den Apache hinterher neustarten. Noch ein Tipp: Entferne das <IfModule> aus der .htaccess. Dann kriegst du einen 500 Internal Server Error, wenn das Modul nicht geladen ist. Ist vielleicht besser. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
so, hab jetzt die httpd.conf entsprechend angepasst
und nachdem ich noch die .htaccess wieder komplett entfernt habe, läuft es: C:\Programme\curl> curl -I -H "Accept-Encoding: gzip,deflate" ![]() HTTP/1.1 200 OK Date: Sun, 29 May 2016 11:04:47 GMT Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 Last-Modified: Wed, 12 Nov 2014 15:49:59 GMT ETag: "5a1-507ab591677c0-gzip" Accept-Ranges: bytes Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 770 Content-Type: text/html Vielen Dank für die Hilfe, Valle. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Klappt doch noch nicht ganz.
Bei php wird wohl noch nicht gezippt C:\Programme\curl> curl -I -H "Accept-Encoding: gzip,deflate" ![]() HTTP/1.1 200 OK Date: Sun, 29 May 2016 11:33:45 GMT Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 X-Powered-By: PHP/5.6.3 Content-Type: text/html; charset=UTF-8 obwohl ich mal versucht habe hier php zu ergänzen:
Delphi-Quellcode:
<Directory "C:/your-server-root/manual"> #any path to which you wish to apply gzip compression to!
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html # or any file type you wish AddOutputFilterByType DEFLATE text/php </IfModule> </Directory>
Delphi-Quellcode:
<Directory "C:/your-server-root/manual"> #any path to which you wish to apply gzip compression to!
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript </IfModule> </Directory> |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
weitere Erkenntnis:
wenn ich nun in mein php-Script folgende Zeile einfüge: ob_start('ob_gzhandler'); und TIdHTTP.Compressor:=TIdCompressorZLib; zuweise dann klappt es :thumb: Wenn ich TIdHTTP.Compressor:=nil; setze dann sehe ich, dass ein gezippter String kommt :idea: So, später schaue ich mir dann mal WireShark ohne Firewall an. Danke für die Hilfen.:thumb: |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Mich würde dennoch interessieren,
ob man das nicht auch mit einer Delphi-Funktion wie gZDecompressStr() hinbekommt. |
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
Zitat:
Zitat:
|
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
Zitat:
wenn ich
Delphi-Quellcode:
in php weglasse, wird nicht gezippt.
ob_start('ob_gzhandler');
Delphi-Quellcode:
bringt nichts
AddOutputFilterByType DEFLATE text/php text/plain
|
AW: PHP gzcompress(); Delphi ZDecompressStr ( ) Data error
bei das Entzippen über die Indy-Komponente funktioniert anscheinend nur,
wenn der Webserver das Zippen unterstützt: daher:
Delphi-Quellcode:
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'))
ob_start('ob_gzhandler'); else ob_start(); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz