對於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行業人員進入!
以上就介紹了PHP 用 curl 讀取 HTTP chunked 數據,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。