[PHP] fsockopen() ger mig headers och oönskad information

Permalänk
Medlem

[PHP] fsockopen() ger mig headers och oönskad information

Tillverkar just nu en sida till ett företag som är återförsäljare av produkter fån ett annat företag.
Återförsäljaren vill kunna visa upp produkter från det andra företaget på sin hemsida, d.v.s. hämta information från en extern sida.

Min första tanke när jag skulle göra denna lösningen var nån form av "include()" men p.g.a. säkerhetsinställningar på servrar jag inte får röra så var det stopp för detta.
Valet började luta åt <iframe>, vilket jag inte gillar alls.

Men sen hittade jag PHP's möjligheter att hämta extern information på annat sätt, rättare sagt "fsockopen()". Och detta fungerar faktiskt precis som jag vill. Eller, ja, nästan...

När man hämtar information med "fsockopen()" drar den även med headers och annat skit. All information som hämtas börjar med något i stil med:

HTTP/1.1 200 OK Transfer-Encoding: chunked Date: Tue, 08 Aug 2006 22:47:06 GMT Server: Apache/2.0.55 (Win32) PHP/4.4.2 X-Powered-By: PHP/4.4.2 --------------: ---- Connection: close Content-Type: text/html

...och på slutet av den hämtade information kan den få för sig att slänga in en liten "0". Men ibland slänger den in anna information mitt i den hämtade informationen, såsom "F36" eller något annat lurigt. T.ex. mitt i en tabell:

<table> <tr> <td>Foo</td> <td>Bar</td> </tr> F36 <tr> <td>Foo</td> <td>Bar</td> </tr> </table> 0

Går det verkligen inte bara att stänga av denna extra informationen på något vis?
För som sagt är jag inte ute efter ett annat sätt att hämta in informationen då detta sättet funkar nästan kanon

Permalänk
Medlem

Dela stängen vid \r\n\r\n och skriv sedan ut det efter bara, det som är efter har jag dock ingen aning om vad det är, finns också inbyggda libs för detta i php som t.ex. curl, fast det är ju häffigare att göra själv.

Permalänk
Medlem
Permalänk
Medlem

Men på detta vis får jag väl inte bort de "nysningar" som hämtningen slänger ur sig mitt i koden, såsom t.ex. "F36" o.s.v?

EDIT:
file_get_contents() kan jag nog inte använda. Glömde säga att det jag hämtar måste vara resultatet av ett skript som körs på den externa servern.
Jag ska kunna hämta resultat från en databasquery eller liknande

Men tack för tipset

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ckytep
Men på detta vis får jag väl inte bort de "nysningar" som hämtningen slänger ur sig mitt i koden, såsom t.ex. "F36" o.s.v?

Pasta koden så kanske det går lättare :/.

Permalänk
Medlem

Allright, först så körs det lokala skriptet:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Foobar</title> </head> <body> <p>Lite text som skrivs ut på den lokala servern.</p> <?php $fp = fsockopen("externalfooserver", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET /foobar.php"; $out .= "Host: promotech\r\n"; $out .= "Content-Type: text/html\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 256); } fclose($fp); } ?> <p>Lite mer information som är lokal.</p> </body> </html>

...mitt däri hämtar information med hjälp av fsockopen() och en fil på en extern server som heter "foobar.php".

<?php print('<p>Information som hämtades från en extern server</p>') ?>

När den kört klart alltihop blir outputen till webbläsaren något i stil med:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Foobar</title> </head> <body> <p>Lite text som skrivs ut på den lokala servern.</p> ************************************************************************************ HTTP/1.1 200 OK Transfer-Encoding: chunked Date: Tue, 08 Aug 2006 23:18:21 GMT Server: Apache/2.0.55 (Win32) PHP/4.4.2 X-Powered-By: PHP/4.4.2 --------------: --- Connection: close Content-Type: text/html 21B <p>Information som hämtades från en extern server</p> 0 ************************************************************************************ <p>Lite mer information som är lokal.</p> </body> </html>

(bortse från ***-stjärnorna, de är bara till för att förstärka vilken del som är vilken)

EDIT:
Det jag skulle vilja ha bort därifrån automagiskt är alltså headern, nollan på slutet samt "21B" som är mitt i smeten.
Är det större hätningar från externa sidor då får jag fler sådana här siffer-och-bokstavs-kombinationer...

Permalänk
Hedersmedlem

file_get_contents() löser det där, både headers och siffror mitt i smeten.

Siffrorna (i hexadecimal form) är pga "Transfer-Encoding: chunked", den skickar över datan i små delar. "Nysningarna" anger hur många bytes nästa chunk är, så att klienten vet hur mycket den ska ladda hem.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem

Men körs verkligen skriptet på den externa servern och är det resultatet av den körningen som man hämtar med "file_get_contents()"?

Jag får testa... Tack för hjälpen hittils!

Permalänk
Medlem

Om du anropar något via http://server.com/fil.php så får du resultatet av körningen av fil.php på server.com.

Visa signatur

Brass knuckles and a 2x4

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Ckytep
Men körs verkligen skriptet på den externa servern och är det resultatet av den körningen som man hämtar med "file_get_contents()"?

Jag får testa... Tack för hjälpen hittils!

Ja, du kan inte få hem källkoden från en PHP-sida om servern inte är felinställd. Alltså är det resultat av scriptet eller ingenting som du får hem.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem

Jo minsann det verkar funka!

Det som har lurat mig bort från "file_get_contents()" är att det inte verkar funka på min lokala lilla Apache-server...
När jag körde ett litet test av funktionen på t.ex. en B-one-server då funkade utan problem.

Är det något som spärras som "default" i Apache som gör att det inte funkar lokalt?

EDIT:
Såg nu att det måste stå "allow_url_fopen = On" i php.ini, för att file_get_contents() ska kunna hämta externa filer.
http://se.php.net/file_get_contents

Men det ville sig inte ändå... Och det kan inte vara brandväggsproblem då Apache har "vidöppet fönster" just nu.

EDIT2:
Kan det vara den här buggen jag snubblar över när jag kör det lokalt?
http://bugs.php.net/bug.php?id=36017
Kör PHP 4.4.2, medan den fungerande B-one-servern kör 4.4.1.
Ska testa att köra samma version som B-one...

EDIT3:
Trots tester med både 4.4.1 och 4.4.3 så blir det "time-out" lokalt när jag försöker hämta information från en extern sida.
Eller rättare sagt säger Firefox:
"Anslutningen avbröts"...

Men varför funkar fsocksopen men inte file_get_contents?

EDIT4:
Rättare sagt krashar faktiskt Apache enligt error.log så fort jag försöker köra file_get_contents mot en extern fil:
"Parent: child process exited with status 3221225477 -- Restarting."

EDIT5:
Det var buggen som jag nämnde i "EDIT2" som var problemet!
Jag råkade missa en sak i uppgraderingen som gjorde att PHP fortfarande var 4.4.2 lokalt...

Det funkar m.a.o. ypperligt med PHP 4.4.3! Tack för hjälpen allihop!