PHP Socket Problem....
RFZ
- php
0 RFZ0 Christian Kruse
Moin, ich hab ein Dickes Problem...
Ich Bau via Socket eine Verbindung zu nem Webserver auf (funktion unten) und bekomme dann ab und zu kleine Fehler in dem empfangenen Text. z.B. aus 'nicht' wird 'nich1000t' oder aus 'das' wird 'daa2as'. Versteht sich von selbst dass ich solche Fehler nicht brauchen kann, warscheinlich is eh schon ein grosser Teil meiner Datenbank versaut. Also, bitte helf mir :)
Funktion:
function readurl($url)
{
$url = eregi_replace("http://","",$url);
$do_be = @strpos($url,"/");
$server = substr($url,0,$do_be);
$document = substr($url,$do_be);
$port=80;
if(strlen($document) > 0) {
$fp = @fsockopen ("$server", $port, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br>\n";
} else {
$header = <<<header
GET $document HTTP/1.1
Accept: */*
Accept-Language: de
User-Agent: Test-Script (by RFZ)
Host: $server
Connection: Close
header;
fputs ($fp, $header);
while (!feof($fp)) {
$body = $body. fgets ($fp,128);
}
fclose ($fp);
}
}
if(substr($body,0,12) !="HTTP/1.1 200") $body = false;
$head_end = strpos($body,"\r\n\n") + 3;
$body = substr($body,$head_end);
return $body;
}
cu RFZ
Nochwas, anscheinend tritt der Fehler nur auf wenn ich die URL das erste mal öffne. Ausserdem scheint dann am Anfang (nach dem Head) immer 'ef6' zu stehen...
cu RFZ
Hallo,
Ich Bau via Socket eine Verbindung zu nem Webserver auf (funktion unten)
Warum benutzt du nicht den fopen()-Wrapper?
$fd = fopen('http://url/','r');
if(!$fd) die("error!");
$str = '';
while($line = fread($fd,512)) {
$str .= $line;
}
function readurl($url)
{
$url = eregi_replace("http://","",$url);
besser preg_replace()
$do_be = @strpos($url,"/");
$server = substr($url,0,$do_be);
$document = substr($url,$do_be);
$port=80;
Was, wenn der Port nicht 80 ist?
$header = <<<header
GET $document HTTP/1.1
Accept: */*
Den Header wuerde ich eher weglassen wollen als */* zu schicken.
Accept-Language: de
User-Agent: Test-Script (by RFZ)
Host: $server
Connection: Close
header;
Hier ist ein Newline zu viel. Nur eine Leerzeile!
while (!feof($fp)) {
$body = $body. fgets ($fp,128);
Nimm fread() statt fgets(). Nicht jede Zeile hat Zeilenenden...
if(substr($body,0,12) !="HTTP/1.1 200") $body = false;
Was ist bei einer 1.0-Antwort? Kann passieren, aus verschiedensten Gruenden. Ein Fall fuer
preg_match()...
$head_end = strpos($body,"\r\n\n") + 3;
du meinst IMHO strpos($body,"\015\012\015\012") + 4;
Gruesse,
CK
Moin, danke für die Antwort. Die möglichen Fehler bei um die URL zu teilen, oder eine korrekte Antwort zu bestimmen sind mal egal, ausserdem hab ich bisher nur einen Server im Auge und weiss daher was er antwortet...
Das mit fgets() und fread() werd ich aber mal probieren.
fopen() kann ich nicht verwenden, da ich gern einen eigenen Header senden möchte (manchmal sogar muss, wegen cookies).
cu RFZ
So, mit fread() hab ich leider das selbe Ergebnis :(
fopen() funktioniert ist aber auf dauer keine Lösung....
cu RFZ