在用webman做http接口服務(wù),開發(fā)一款前后端分離的應(yīng)用
要實現(xiàn):用戶通過接口下載文件的功能,經(jīng)測試通過下面的方法的可以進(jìn)行下載:
```php
<?php
namespace app\controller;
use support\Request;
Class DownloadRep{
//下載備份文件
public function DownloadRepBackup(Request $request)
{
$filePath = "...";
return response()->download($filePath);
}
}
現(xiàn)在要實現(xiàn)大文件下載,可能是上百M,看到論壇有提供下面的下載方式,想請問在上述控制器的任何一個方法內(nèi)能拿到$connection對象來使用嗎?對文檔提供的回調(diào)函數(shù)的用法不是很理解。
(或者說在webman的控制器的函數(shù)中如何使用$conection對象(即TcpConnection實例))
<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
$worker = new Worker('http://0.0.0.0:4236');
$worker->onMessage = function($connection, $data)
{
if($_SERVER == '/favicon.ico')
{
return $connection->send("HTTP/1.0 404 Not Found\r\nContent-Length: 0\r\n\r\n", true);
}
// 這里發(fā)送的是一個大的pdf文件,如果是其它格式的文件,請修改下面代碼中http頭
send_file($connection, "/your/path/xxx.pdf");
};
function send_file($connection, $file_name)
{
if(!is_file($file_name))
{
$connection->send("HTTP/1.0 404 File Not Found\r\nContent-Length: 18\r\n\r\n404 File Not Found", true);
return;
}
// ======發(fā)送http頭======
$file_size = filesize($file_name);
//省略...
$connection->onBufferDrain = function($connection)use($do_write)
{
$connection->bufferFull = false;
$do_write();
};
// 執(zhí)行發(fā)送
$do_write();
}
Worker::runAll();
直接用 response()->download()
就行
感謝解答。可是我現(xiàn)在無論使用 response()->download() 還是 response()->file() 還是 response()->withFile() ,前端的下載都會卡在不超過2M的時候,下載沒有結(jié)束沒有報錯但是就是一直下載加載中,我用前端的請求方法請求另外的文件下載接口,就可以正常下載,請問是否為webman哪里的配置信息需要更改嗎?
我這測試正常。測試代碼
<?php
namespace app\controller;
use support\Request;
class Index
{
public function index(Request $request)
{
return response('')->download(public_path(). '/1.zip');
}
}
1.zip 大概10M
webman不支持使用使用$connection對象,不過你可以在webman里自定義進(jìn)程,webman自定義進(jìn)程和workerman使用起來幾本沒有區(qū)別