对于 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行业人员进入!