最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關于PHP 如何用 curl 讀取 HTTP chunked 數(shù)據(jù)

 更新時間:2016年02月26日 09:20:57   作者:idea''s blog  
通過本文給大家介紹php用curl讀取http chunked數(shù)據(jù)的方法,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起學習吧

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

在 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;
}

但是, 這里有一個問題. 對于一個 chunk, 回調函數(shù)可能會被調用多次, 每一次大概是 16k 的數(shù)據(jù). 這顯然不是我們希望得到的. 因為 icomet 的一個 chunk 是以 "\n" 結尾, 所以回調函數(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ù)時遇到了一個神奇的問題,具體情況如下:

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

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

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消息分成幾個部分傳輸。同時適用于HTTP請求(從客戶端到服務器)和 HTTP響應(從服務器到客戶端)

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服務器可將數(shù)據(jù)傳輸?shù)娇蛻舳藨贸绦颍ㄍǔJ且粋€網(wǎng)絡瀏覽器)使用哪些方式。通常情況下,在HTTP響應數(shù)據(jù)是按照一整塊發(fā)送給客戶端的,數(shù)據(jù)的長度是由Content - Length頭域表示。數(shù)據(jù)的長度很重要,因為客戶需要知道在哪里響應結束和后面的響應何時啟動。而使用Chunked編碼方式,不管怎樣,數(shù)據(jù)都會分割成一系列的數(shù)據(jù)塊和一個或多個轉發(fā)的“塊”,因此服務器在知道內容的長度之前,就可以開始發(fā)送數(shù)據(jù)后。通常情況下,這些數(shù)據(jù)塊的大小是一樣的,但也并不是絕對的。

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

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

編過碼的響應內容:

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

25

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

1A

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

0

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

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

情況搞清楚了,那么我們怎么來解碼這個編碼后的數(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;
}

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

相關文章

  • PHP下用Swoole實現(xiàn)Actor并發(fā)模型的方法

    PHP下用Swoole實現(xiàn)Actor并發(fā)模型的方法

    這篇文章主要介紹了PHP下用Swoole實現(xiàn)Actor并發(fā)模型的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • Laravel 5框架學習之子視圖和表單復用

    Laravel 5框架學習之子視圖和表單復用

    本文給大家主要介紹的是Laravel5框架中的子視圖以及表單復用的用法,十分的細致全面,對于大家熟練掌握Laravel5框架非常有幫助,有需要的小伙伴可以參考下
    2015-04-04
  • PHP設計模式(八)裝飾器模式Decorator實例詳解【結構型】

    PHP設計模式(八)裝飾器模式Decorator實例詳解【結構型】

    這篇文章主要介紹了PHP設計模式:裝飾器模式Decorator,結合實例形式分析了PHP裝飾器模式Decorator相關概念、功能、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-05-05
  • PHP實現(xiàn)中文圓形印章特效

    PHP實現(xiàn)中文圓形印章特效

    心血來潮,寫了個圓形印章生成器,字體的弧形旋轉頗費功夫??偹阈Ч€不錯,代碼存檔。
    2015-06-06
  • 基于Zookeeper的使用詳解

    基于Zookeeper的使用詳解

    本篇文章介紹了,基于Zookeeper的使用說明,需要的朋友參考下
    2013-05-05
  • 解決laravel-admin 自己新建頁面里 js 需要刷新一次的問題

    解決laravel-admin 自己新建頁面里 js 需要刷新一次的問題

    今天小編就為大家分享一篇解決laravel-admin 自己新建頁面里 js 需要刷新一次的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • PHP網(wǎng)絡處理模塊FPM源碼分析

    PHP網(wǎng)絡處理模塊FPM源碼分析

    這篇文章主要為大家介紹了PHP網(wǎng)絡處理模塊FPM源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 最新版本PHP 7 vs HHVM 多角度比較

    最新版本PHP 7 vs HHVM 多角度比較

    PHP 7 是 PHP 社區(qū)對 HHVM 的回應。PHP 7 發(fā)布的預覽版本號稱比之前的 PHP 5 的性能要提升100%。不過,PHP 還有一個競爭對手 HHVM (HipHop Virtual Machine) 一個運行 PHP 代碼的虛擬工具。二者直接的比較正在升溫,那么讓我們來看一下他們直接的性能對比吧
    2016-02-02
  • 深入解析PHP底層機制及相關原理

    深入解析PHP底層機制及相關原理

    這篇文章主要介紹了深入解析PHP底層機制及相關原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • php mysql 留言本應用實例

    php mysql 留言本應用實例

    實例說明制作一個php+mysql留言本
    2009-03-03

最新評論

项城市| 乌拉特中旗| 抚远县| 名山县| 贵溪市| 威信县| 西和县| 双牌县| 类乌齐县| 玛纳斯县| 鹤壁市| 遂川县| 平阳县| 武宣县| 刚察县| 略阳县| 小金县| 安龙县| 锡林郭勒盟| 沅陵县| 休宁县| 南陵县| 海盐县| 秀山| 色达县| 日照市| 沁阳市| 启东市| 深水埗区| 车险| 五峰| 清徐县| 三河市| 句容市| 南开区| 台湾省| 交城县| 茂名市| 宁津县| 乐业县| 屯昌县|