一喧笔、遇到的問題:
在使用workerman中的http組件React\HttpClient\Client時出現(xiàn)分段響應的問題诅蝶。
舉個例子:正常返回的json字符串是“{'code':0,'mes':'success','data':'123456789'}”,異常返回“{'code':0,'mes':'success','data':'123”和“456789'}”兩個json字符串叔扼。
二刽宪、原因分析(有大神做更正嗎):
由于服務器生成HTTP回應是無法確定信息大小的摆昧,這時用Content-Length就無法事先寫入長度顿苇,而需要實時生成消息長度峭咒,這時服務器一般采用Chunked編碼(響應頭里Transfer-Encoding:chunk)。
造成一次請求兩個響應纪岁,上述返回的josn字符串被分割為兩段凑队。
三、解決方案:
<?php
$loop = React\EventLoop\Factory::create();
$client = new React\HttpClient\Client($loop);
$file = new \React\Stream\WritableResourceStream(fopen('sample.mp4', 'w'), $loop);
$request = $client->request('GET', 'http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4');
$request->on('response', function (\React\HttpClient\Response $response) use ($file) {
$size = $response->getHeaders()['Content-Length'];
$currentSize = 0;
$progress = new \React\Stream\ThroughStream();
$progress->on('data', function($data) use ($size, &$currentSize){
$currentSize += strlen($data);
echo "Downloading: ", number_format($currentSize / $size * 100), "%\n";
});
$response->pipe($progress)->pipe($file);
});
$request->end();
$loop->run();