mmofacts.com

Seltsames PHP Problem

gepostet vor 16 Jahre, 10 Monate von raufaser
Hi Leute, vorweg: Ich KOTZ gleich.

$dfp = fopen( "debug.txt", "wb" );
fwrite( $dfp, "Test\nTEst\nTest\nTest\r\nTest\rTESTENDE" );
fclose( $dfp );
Wenn man die Datei mit einem Hexeditor öffnet, dann hat er statt "\n" ein "\r\n" geschrieben. Sprich: aus 0x0A wird 0x0D 0x0A. Ein einzelnes 0x0D wird einfach entfernt.
Ich verstehe absolut nicht warum und wie ich dieses Verhalten beeinflussen kann. Hab schon alles ausprobiert. fprintf, etc pp... auch php.net schweigt sich dazu aus. Die sagen ledigt was bei fwrite in Bezug auf die Längenangabe und dem Verhalten von Magic Quotes, was auf mein Problem aber auch keinen Einfluss hat.
Hintergrund: Ich schreibe gerade einen Wrapper, der auch Image Upload können muss. Kann er auch schon und funktioniert alles super, nur wenn ich das Bild auslese (fread oder file_get_contents) und dann mit fprintf oder fwrite mittels fsockopen auf den Webserver schreibe, dann macht er aus 0x0A auch 0x0D 0x0A und entfernt einzelne 0x0D. Bei einem Bild ist das nicht wirklich von Vorteil, weil es danach nämlich IM ARSCH ist.
PHP Version: PHP 5.0.5-2ubuntu1.8 (cli) (built: Mar 7 2007 17:13:07)
(Keinen Einfluss drauf, ist Firmenserver und ich darf da kein Update machen... warum auch immer...)
Ich komm einfach nicht auf eine Lösung und bin echt am verzweifeln. Vielleicht gibt es gar keine Lösung... zumal ich jetzt schon 7 Stunden daran rumprobiert habe.
Gruß,
Marc
gepostet vor 16 Jahre, 10 Monate von Drezil
hmm... vielleicht verpfuscht die "-prüfroutine da was ..
kannst je mal '' statt "" verwenden, also:
$dfp = fopen( 'debug.txt', 'wb' );

fwrite( $dfp, 'Test\nTEst\nTest\nTest\r\nTest\rTESTENDE' );
fclose( $dfp );
aber ensonsten habe ich auch ka ..
gepostet vor 16 Jahre, 10 Monate von TheUndeadable
Würde nen Bugreport schreiben.
$dfp = fopen( "debug.txt", "wb" );
fwrite( $dfp, "Test\nTEst\nTest\nTest\r\nTest\rTESTENDE" );
b = Binary <- Das fordert eigentlich, dass die Daten 1:1 rauskommen.
Was passiert wenn du statt "Test\nTest" folgendes schreibst:
"Test" . chr (13) . "Test";
Dann wäre zumindest sicher, dass die IO-Routine selbst funktioniert, nur der Parser selbst sich etwas merkwürdig verhält (also so wie man es von PHP erwartet).
gepostet vor 16 Jahre, 10 Monate von raufaser
Also mit einfachen Anführungszeichen geht das ja nicht, weil dann ja \n nicht mehr umgesetzt wird. Ist aber auch egal, weil das ja nur als Beispiel gedacht ist.
Ich habe es übrigens gerade mal auf meinem privaten Server getestet (PHP 5.2.3): Der macht es richtig.
Es ist zum verrückt werden ...
Edit:
Original von TheUndeadable

Was passiert wenn du statt "Test\nTest" folgendes schreibst:
"Test" . chr (13) . "Test";
Hab ich alles schon ausprobiert... keine Änderung am Verhalten.
Gruß,
Marc
gepostet vor 16 Jahre, 10 Monate von TheUndeadable
Was macht:
> "Test" . chr (13) . "Test"; ?
gepostet vor 16 Jahre, 10 Monate von raufaser
chr( 13 )
ergibt im String ein einfaches 0x0D - hab ich mir mit urlencode ausgeben lassen.
Beim fwrite wird das 0x0D entfernt.
Ein chr( 10 ) ergibt im String ein einfaches 0x0A.
Beim fwrite wird daraus 0x0D 0x0A.
gepostet vor 16 Jahre, 10 Monate von TheUndeadable
Dann ist fwrite in meinen Augen buggy. Es akzeptiert das 'b' aus deinem fopen nicht.
BTW: Besonders schön finde ich folgenden Kommentar aus der Hilfe:
"Zusätzlich kann mode der Buchstabe 'b' hinzugefügt werden, der die Behandlung von Binärdateien erlaubt. Dies ist nur auf Systemen sinnvoll, welche zwischen Binär- und Text-Dateien unterscheiden (z.B. Windows. Ist bei Unix sinnlos). "
gepostet vor 16 Jahre, 10 Monate von raufaser
Also ich hab inzwischen auch die Vermutung, dass es ein BUG sein muss bei dieser PHP Version. Ich habe ein solches Verhalten sonst noch nie beobachten können.
Mir fällt auch einfach kein Workaround ein...
Edit: Und was noch seltsam ist - nicht nur fwrite, sondern auch mit fprintf funktioniert es nicht. Also muss das Filehandling in der PHP Version komplett eine Macke haben...
Marc

Auf diese Diskussion antworten