欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP怎么用curl讀取HTTPchunked數(shù)據(jù)-創(chuàng)新互聯(lián)

這篇文章主要介紹PHP怎么用curl讀取HTTP chunked數(shù)據(jù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)資興免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

對于 Web 服務(wù)器返回的 HTTP chunked 數(shù)據(jù), 我們可能希望在每一個(gè) chunk 返回時(shí)得到回調(diào), 而不是所有的響應(yīng)返回后再回調(diào). 例如, 當(dāng)服務(wù)器是 icomet 的時(shí)候.

在 PHP 中使用 curl 代碼如下:

<?php 
$url = "http://127.0.0.1:8100/stream";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'myfunc');
$result = curl_exec($ch);
curl_close($ch);
function myfunc($ch, $data){
$bytes = strlen($data);
// 處理 data
return $bytes;
}

但是, 這里有一個(gè)問題. 對于一個(gè) chunk, 回調(diào)函數(shù)可能會(huì)被調(diào)用多次, 每一次大概是 16k 的數(shù)據(jù). 這顯然不是我們希望得到的. 因?yàn)?icomet 的一個(gè) chunk 是以 "\n" 結(jié)尾, 所以回調(diào)函數(shù)可以做一下緩沖.

function myfunc($ch, $data){
$bytes = strlen($data);
static $buf = '';
$buf .= $data;
while(1){
$pos = strpos($buf, "\n");
if($pos === false){
break;
}
$data = substr($buf, 0, $pos+1);
$buf = substr($buf, $pos+1);
// 處理 data
}
}

下面給大家介紹下chunked php使用fsockopen讀取分段數(shù)據(jù)(transfer-encoding: chunked)

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


讀取地址: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內(nèi)容:

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>

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


在Google上搜索該關(guān)鍵詞,在維基百科上找到對這個(gè)聲明的解釋(由于沒有中文版,我只能自己按照意思翻譯):


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)

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


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ù)器可將數(shù)據(jù)傳輸?shù)娇蛻舳藨?yīng)用程序(通常是一個(gè)網(wǎng)絡(luò)瀏覽器)使用哪些方式。通常情況下,在HTTP響應(yīng)數(shù)據(jù)是按照一整塊發(fā)送給客戶端的,數(shù)據(jù)的長度是由Content - Length頭域表示。數(shù)據(jù)的長度很重要,因?yàn)榭蛻粜枰涝谀睦镯憫?yīng)結(jié)束和后面的響應(yīng)何時(shí)啟動(dòng)。而使用Chunked編碼方式,不管怎樣,數(shù)據(jù)都會(huì)分割成一系列的數(shù)據(jù)塊和一個(gè)或多個(gè)轉(zhuǎn)發(fā)的“塊”,因此服務(wù)器在知道內(nèi)容的長度之前,就可以開始發(fā)送數(shù)據(jù)后。通常情況下,這些數(shù)據(jù)塊的大小是一樣的,但也并不是絕對的。


大概意思了解后,我們來看例子:


Chunked編碼使用若干個(gè)Chunk串連而成,由一個(gè)標(biāo)明長度為0的chunk標(biāo)示結(jié)束。每個(gè)Chunk分為頭部和正文兩部分,頭部內(nèi)容指定下一段正文的字符總數(shù)(十六進(jìn)制的數(shù)字)和數(shù)量單位(一般不寫),正文部分就是指定長度的實(shí)際內(nèi)容,兩部分之間用回車換行(CRLF)隔開。在最后一個(gè)長度為0的Chunk中的內(nèi)容是稱為footer的內(nèi)容,是一些附加的Header信息(通常可以直接忽略)。具體的Chunk編碼格式如下:


編過碼的響應(yīng)內(nèi)容:

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

25


這是第一段數(shù)據(jù)

1A


然后這是第二段數(shù)據(jù)


0

解碼的數(shù)據(jù):


這是第一段內(nèi)容,然后這是第二段數(shù)據(jù)


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


在php官方手冊fsockopen函數(shù)下面的評論中,已經(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;
}

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

以上是“PHP怎么用curl讀取HTTP chunked數(shù)據(jù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文標(biāo)題:PHP怎么用curl讀取HTTPchunked數(shù)據(jù)-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://aaarwkj.com/article42/dipiec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、企業(yè)建站、域名注冊、面包屑導(dǎo)航商城網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
亚洲国产日韩精品av| 国产三级尤物在线观看| 男人天堂av网在线观看| 精品国产18禁99久久久久久| 亚洲成人av毛片在线观看| 中文字幕乱码高清欧美日韩| 另类视频在线观看免费| av天堂久久这里只有精品美国| 久久国产亚洲欧美日韩精品| 91人妻精品一区二区| 国产熟女精品自拍嫩草| 天天操天天射夜夜爽| 97色伦综合在线欧美| 日韩中字在线一区二区| 亚洲精品中文字幕久久| 国产精品三级久久久| 日本理伦片一区二区| 极品丝袜美腿一区二区| 午夜福利主播一区二区| 色婷婷激一区二区三区| 老汉av免费在线观看| 自拍偷拍亚洲精品偷一| 亚洲欧美精品一区二区三区| 国产一级av在线播放| 亚洲激情欧美日韩精品| 中文字幕日韩精品国产| 日本中文字幕在线一区| 求个手机免费在线观看av网址| 免费国产三级在线观看| 一本久久精品午夜福利| 韩国理伦三级做爰观看| 亚洲成av人片青草影院| 国产又粗又硬又长又爽在线观看| 日韩欧美亚洲自拍另类| 超碰国产熟女一区二区三区| 极品美女粉嫩啪啪高潮| 国产老熟女高潮一区二区| 久久 久久国内精品亚洲| 精品乱码一区二区三区四区| 亚洲精品日韩一区二区| 亚洲狠狠爱一区二区三区|