對於 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行業人員進入!