源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

关于PHP 如何用 curl 读取 HTTP chunked 数据

  • 时间:2022-11-11 13:35 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:关于PHP 如何用 curl 读取 HTTP chunked 数据
对于 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
}
}
[b]下面给大家介绍下chunked php使用fsockopen读取分段数据(transfer-encoding: chunked) [/b] 使用fsockopen读取数据时遇到了一个神奇的问题,具体情况如下: 读取地址:[url=http://blog.maxthon.cn/?feed=rss2]http://blog.maxthon.cn/?feed=rss2[/url] 读取代码:
<?php
$fp = fsockopen("blog.maxthon.cn", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET /?feed=rss2 HTTP/1.1\r\n";
$out .= "Host: blog.maxthon.cn\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>

  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部