Skip to content

Commit 2dedb70

Browse files
committed
优化文件输出
1 parent 535cfed commit 2dedb70

File tree

3 files changed

+29
-9
lines changed

3 files changed

+29
-9
lines changed

README.md

+17
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,20 @@ class Controller {
120120
}
121121
}
122122
```
123+
124+
### 流式输出
125+
126+
```php
127+
128+
class Controller {
129+
130+
public function action(){
131+
return \think\swoole\helper\iterator(value(function(){
132+
foreach(range(1,10) as $i)
133+
yield $i;
134+
sleep(1);//模拟等待
135+
}
136+
}));
137+
}
138+
}
139+
```

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"require": {
1212
"php": "^8.0",
1313
"ext-json": "*",
14-
"ext-swoole": "^4.0|^5.0",
14+
"ext-swoole": "^4.0|^5.0|^6.0",
1515
"topthink/framework": "^6.0|^8.0",
1616
"nette/php-generator": "^4.0",
1717
"open-smf/connection-pool": ">=1.0",

src/concerns/InteractsWithHttp.php

+11-8
Original file line numberDiff line numberDiff line change
@@ -263,11 +263,13 @@ protected function sendIterator(Response $res, IteratorResponse $response)
263263

264264
protected function sendFile(Response $res, \think\Request $request, FileResponse $response)
265265
{
266-
$ifNoneMatch = $request->header('If-None-Match');
267-
$ifRange = $request->header('If-Range');
268266

269-
$code = $response->getCode();
270-
$file = $response->getFile();
267+
$header = $response->getHeader();
268+
$code = $response->getCode();
269+
$file = $response->getFile();
270+
271+
$ifNoneMatch = $request->header('If-None-Match');
272+
$ifRange = $request->header('If-Range');
271273
$eTag = $response->getHeader('ETag');
272274
$lastModified = $response->getHeader('Last-Modified');
273275

@@ -277,6 +279,7 @@ protected function sendFile(Response $res, \think\Request $request, FileResponse
277279

278280
if ($ifNoneMatch == $eTag) {
279281
$code = 304;
282+
unset($header['Content-Length']);
280283
} elseif (!$ifRange || $ifRange === $eTag || $ifRange === $lastModified) {
281284
$range = $request->header('Range', '');
282285
if (Str::startsWith($range, 'bytes=')) {
@@ -294,15 +297,15 @@ protected function sendFile(Response $res, \think\Request $request, FileResponse
294297
if ($start <= $end) {
295298
$end = min($end, $fileSize - 1);
296299
if ($start < 0 || $start > $end) {
297-
$code = 416;
298-
$response->header([
300+
$code = 416;
301+
$header = array_merge($header, [
299302
'Content-Range' => sprintf('bytes */%s', $fileSize),
300303
]);
301304
} elseif ($end - $start < $fileSize - 1) {
302305
$length = $end < $fileSize ? $end - $start + 1 : -1;
303306
$offset = $start;
304307
$code = 206;
305-
$response->header([
308+
$header = array_merge($header, [
306309
'Content-Range' => sprintf('bytes %s-%s/%s', $start, $end, $fileSize),
307310
'Content-Length' => $end - $start + 1,
308311
]);
@@ -312,7 +315,7 @@ protected function sendFile(Response $res, \think\Request $request, FileResponse
312315
}
313316

314317
$this->setStatus($res, $code);
315-
$this->setHeader($res, $response->getHeader());
318+
$this->setHeader($res, $header);
316319

317320
if ($code >= 200 && $code < 300 && $length !== 0) {
318321
$res->sendfile($file->getPathname(), $offset, $length);

0 commit comments

Comments
 (0)