PHP 用 curl 讀取 HTTP chunked 數據

 對於 Web 服務器返回的 HTTP chunked 數據, 咱們可能但願在每個 chunk 返回時獲得回調, 而不是全部的響應返回後再回調. 例如, 當服務器是 icomet 的時候.php

   在 PHP 中使用 curl 代碼以下:git

<?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, 回調函數可能會被調用屢次, 每一次大概是 16k 的數據. 這顯然不是咱們但願獲得的. 由於 icomet 的一個 chunk 是以 "\n" 結尾, 因此回調函數能夠作一下緩衝.github

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
    }
}
問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com 下載問啊APP,參與官方懸賞,賺百元現金。

QQ羣290551701 彙集不少互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!
相關文章
相關標籤/搜索