對於 Web 伺服器返回的 HTTP chunked 數據, 我們可能希望在每一個 chunk 返回時得到回調, 而不是所有的響應返回後再回調. 例如, 當伺服器是 icomet 的時候. 在 PHP 中使用 curl 代碼如下: <?php $url = "http://127.0.0.1:810
對於 Web 伺服器返回的 HTTP chunked 數據, 我們可能希望在每一個 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, 回調函數可能會被調用多次, 每一次大概是 16k 的數據. 這顯然不是我們希望得到的. 因為 icomet 的一個 chunk 是以 "\n" 結尾, 所以回調函數可以做一下緩衝.
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行業人員進入!