Garip davranış yuvalarını kullanarak zaman

1 Cevap

Soket kullanan bir web sitesi getiriliyor ben bu garip davranış alıyorum. Dize aşağıda get_content () işlevinden dönen orijinal web sitesinde mevcut olmayan bazı "ekstra bilgi" içermektedir.

function get_content($a, $b, $c = "00")
{
    $request  = "arg01="  . $a;
    $request .= "&arg02="  . $b;
    $request .= "&arg03="  . $c;

    $host = "www.site.com";
    $script = "/page.php";
    $method = "POST";

    $request_length = strlen($request);

    $header = "$method $script HTTP/1.1\r\n";
    $header .= "Host: $host\r\n";
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $header .= "Content-Length: $request_length\r\n";
    $header .= "Connection: close\r\n\r\n";
    $header .= "$request\r\n";

    $socket = @fsockopen($host, 80, $errno, $errstr);
    if ($socket) {
        fputs($socket, $header);
            while(!feof($socket)) {
                $output .= fgets($socket);
            }
        fclose($socket);
    }

    return $output;
}

Baskı $ çıkışı:

HTTP/1.1 200 OK
Date: Fri, 24 Jul 2009 15:20:38 GMT
Server: Apache/2.2.8 (Unix) PHP/4.4.8
X-Powered-By: PHP/4.4.8
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

1f61
<html>
<head>
    <title>

    (...) html here (...)
            <td align='right'><font size='-1'>   18,65</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   24,10</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   18,40</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   24,10</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   24,10</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   18,65</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>
f43
   24,10</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   18,65</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   18,65</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   24,10</font></td>
    (...) html here (...)
            <td align='right'><font size='-1'>   18,40</font></td>

    (...) html here (...)
   </body>
</html>

0

Aşağıdaki blok Not:

            <td align='right'><font size='-1'>
f43
   24,10</font></td>

Bu orijinal HTML üzerinde mevcut değildir. Olmalı

            <td align='right'><font size='-1'>   24,10</font></td>

sadece üzerinde diğerleri gibi etiketleri td.

Bu sorunu düzeltmek için, ben kıvrılma ile yuva yerini aldı.

function get_content($a, $b, $c = "00")
{
    $args  = "arg01="  . $a;
    $args .= "&arg02="  . $b;
    $args .= "&arg03="  . $c;

    $host = "http://www.site.com/page.php";

    $ch = curl_init($host);
    curl_setopt($ch, CURLOPT_URL, $host);
    curl_setopt($ch, CURLOPT_POST, count($args));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_exec($ch);
    $output = curl_multi_getcontent($ch);
    curl_close($ch);

    return $output;
}

CURL sorununu giderir rağmen, ben burada neler olduğunu anlamak istiyorum. Bu "ekstra bilgi" nin kökeni nedir? Böyle bir solucan deliği falan?

Eğer herhangi bir düşünce var mı?

Teşekkürler!

1 Cevap

Bu başlık var çünkü transferlerden içeriği almak sunucu yığın halinde modunda veri (bu kontrol edebilirsiniz:

Transfer-encoding: chunked

.)

Chunked transfer kodlaması bu şekilde çalışır: Sunucu sonraki öbek uzunluğunu temsil eden (ASCII karakter) bir onaltılık sayı gönderir. Sonra sonra tekrar CRLF (\ r \ n), daha sonra yığın, CRLF gönderir, ve sonra tekrar baştan başlar. Örnek:

10
1234567890abcdef
0C
qwertyuiopas

CURL bu işler, ancak ham soket veri okuyorsanız, bu nedenle almak konum içeriği görünür.

So, the additional "f43" you noticed, which was not in the original HTML, is actually the length of the following chunk (3907 bytes.)

Her neyse, (HMTL yığın halinde transfer kodlama gibi) tüm subtilities ile bir protokol uygulanması çok iş temel bir protokol işleyicisi uygulamak için, iki iş çok daha fazla olduğu için, CURL veya başka bir HTTP kütüphane kullanmak iyi bir fikir, Sadece bir temel durumda çalışmak hangi.