欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
php使用fsockopen讀取分段數據(出現多余字符)

使用fsockopen讀取數據時(shí)遇到了一個(gè)神奇的問(wèn)題,具體情況如下:

讀取地址:http://blog.maxthon.cn/?feed=rss2

讀取代碼:

<?php
$fp = fsockopen("blog.maxthon.cn", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /?feed=rss2 HTTP/1.1\r\n";
    $out .= "Host: blog.maxthon.cn\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>

返回http內容:

Date: Mon, 29 Mar 2010 10:16:13 GMT
Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.8b PHP/5.2.6
X-Powered-By: PHP/5.2.6
X-Pingback: http://blog.maxthon.cn/xmlrpc.php
Last-Modified: Wed, 03 Mar 2010 03:13:41 GMT
ETag: "8f16b619f32188bde3bc008a60c2cc11"
Keep-Alive: timeout=15, max=120
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/xml; charset=UTF-8

22de
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"

<description><![CDATA[2009年12月31日
1711
.......
1fe8
]]></description>
            <content:encoded><![CDATA[<p>2009年12月31日<br />
1711</p>

請注意上面那些標紅的4個(gè)字符,它們每隔一段數據就會(huì )出現一次,但是用其他的方法如curl,file_get_contents等取回的數據則沒(méi)有這些玩意。換成其他的網(wǎng)站來(lái)抓取,也只是少數的網(wǎng)站會(huì )出現這種情況,多方搜索無(wú)解后,我無(wú)意中看到了上面返回頭中有這么一個(gè)聲明:Transfer-Encoding: chunked,而常見(jiàn)的Content-lenght字段沒(méi)有了。這個(gè)聲明的大致的意思是傳輸編碼為分段方式。

在Google上搜索該關(guān)鍵詞,在維基百科上找到對這個(gè)聲明的解釋?zhuān)ㄓ捎跊](méi)有中文版,我只能自己按照意思翻譯):

Chunked Transfer Encoding is a mechanism that allows HTTP messages to be split in several parts. This can be applied to both HTTP requests (from client to server) and HTTP responses (from server to client)

分塊傳輸編碼是一種機制,允許將HTTP消息分成幾個(gè)部分傳輸。同時(shí)適用于HTTP請求(從客戶(hù)端到服務(wù)器)和 HTTP響應(從服務(wù)器到客戶(hù)端)

For example, let us consider the way in which an HTTP server  may transmit data  to a client application (usually a web browser). Normally, data delivered in HTTP responses is sent in one piece, whose length is indicated by the Content-Length header field. The length of the data is important, because the client needs to know where the response ends and any following response starts. With chunked encoding, however, the data is broken up into a series of blocks of data and transmitted in one or more "chunks" so that a server may start sending data before it knows the final size of the content that it's sending. Often, the size of these blocks is the same, but this is not always the case.


例如,讓我們考慮HTTP服務(wù)器可將數據傳輸到客戶(hù)端應用程序(通常是一個(gè)網(wǎng)絡(luò )瀏覽器)使用哪些方式。通常情況下,在HTTP響應數據是按照一整塊發(fā)送給客戶(hù)端的,數據的長(cháng)度是由Content - Length頭域表示。數據的長(cháng)度很重要,因為客戶(hù)需要知道在哪里響應結束和后面的響應何時(shí)啟動(dòng)。而使用Chunked編碼方式,不管怎樣,數據都會(huì )分割成一系列的數據塊和一個(gè)或多個(gè)轉發(fā)的“塊”,因此服務(wù)器在知道內容的長(cháng)度之前,就可以開(kāi)始發(fā)送數據后。通常情況下,這些數據塊的大小是一樣的,但也并不是絕對的。

大概意思了解后,我們來(lái)看例子:

Chunked編碼使用若干個(gè)Chunk串連而成,由一個(gè)標明長(cháng)度為0的chunk標示結束。每個(gè)Chunk分為頭部和正文兩部分,頭部?jì)热葜付ㄏ乱欢握牡淖址倲担ㄊM(jìn)制的數字)和數量單位(一般不寫(xiě)),正文部分就是指定長(cháng)度的實(shí)際內容,兩部分之間用回車(chē)換行(CRLF)隔開(kāi)。在最后一個(gè)長(cháng)度為0的Chunk中的內容是稱(chēng)為footer的內容,是一些附加的Header信息(通??梢灾苯雍雎裕?。具體的Chunk編碼格式如下:

編過(guò)碼的響應內容:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
這是第一段數據

1A
然后這是第二段數據
0
 

解碼的數據:

這是第一段內容,然后這是第二段數據

情況搞清楚了,那么我們怎么來(lái)解碼這個(gè)編碼后的數據呢?

在php官方手冊fsockopen函數下面的評論中,已經(jīng)有很多人提出了解決方法

方法1.

<?php
function unchunk($result) {
    return preg_replace_callback(
        '/(?:(?:\r\n|\n)|^)([0-9A-F]+)(?:\r\n|\n){1,2}(.*?)'.
        '((?:\r\n|\n)(?:[0-9A-F]+(?:\r\n|\n))|$)/si',
        create_function(
            '$matches',
            'return hexdec($matches[1]) == strlen($matches[2]) ? $matches[2] : $matches[0];'
        ),
        $result
    );
}

方法二.

function unchunkHttp11($data) {
    $fp = 0;
    $outData = "";
    while ($fp < strlen($data)) {
        $rawnum = substr($data, $fp, strpos(substr($data, $fp), "\r\n") + 2);
        $num = hexdec(trim($rawnum));
        $fp += strlen($rawnum);
        $chunk = substr($data, $fp, $num);
        $outData .= $chunk;
        $fp += strlen($chunk);
    }
    return $outData;
}

方法三.

HTTP/1.1 換成 HTTP/1.0


注意:這兩個(gè)函數的參數都是返回的http原始數據(包括頭)

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
php 自動(dòng)提交表單
PHP抓取網(wǎng)頁(yè)內容的代碼
phpcms 2008最新0day加批量EXP – WebShell'S Blog
php 異步調用方法示例
PHP獲取網(wǎng)頁(yè)內容的幾種方法
HTTP 協(xié)議中的 Transfer-Encoding(分塊傳輸編碼)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久