在4.6版本中,对Swoole\Http\Response做了一些增强:添加Http\Response::isWritable(db56827)(@matyhtf)增强Response\create()方法,可以独立于Server使用(#3998)(@matyhtf)我们来看看上一篇文章的示例代码:useSwoole\Server;使用Swoole\Http\Request;$server=newServer('127.0.0.1',9501);$server->on('Receive',function(Server$server,$fd,$reactor_id,$data){/**@varRequest$request*/$request=Request::create();$request->parse($data);$body='Hello,Swoole';$body_len=strlen($body);$send_data="HTTP/1.1200OK\r\nServer:swoole-server\r\nContent-Type:text/html;charset=utf-8\r\nContent-Length:{$body_len}\r\nConnection:keep-alive\r\n\r\n{$body}";$server->send($fd,$发送数据);});$服务器->开始();用户需要自己处理$send_data的数据,经过这次增强,可以这样使用:useSwoole\Server;useSwoole\Http\Request;useSwoole\Http\Response;$server=newServer('127.0.0.1',9501);$server->on('Receive',function(Server$server,$fd,$reactor_id,$data){/**@var请求$request*/$request=Request::create();$request->parse($data);/**@varResponse$response*/$response=Response::create($server,$fd);$响应->状态(200);$response->end('Hello,Swoole');});$server->start();还可以这样:$server->on('Receive',function(Server$server,$fd,$reactor_id,$data){/**@varRequest$request*/$request=Request::create();$request->parse($data);/**@varResponse$response*/$response=Response::create([$server,$request],$fd);$response->status(200);$response->end('Hello,Swoole');});但步骤不对Server中可以使用,并且和协程Server中也可以使用:useSwoole\Coroutine\Server;useSwoole\Coroutine\Server\Connection;useSwoole\Http\Request;useSwoole\Http\Response;usefunctionSwoole\Coroutine\run;run(function(){$server=newServer('0.0.0.0',9501,false);$server->handle(function(Connection$conn)use($server){$request=Request::create();while(true){$data=$conn->recv();如果(strlen($data)!=$request->parse($data)||$request->isCompleted()){break;}}$response=Response::create([$conn->exportSocket(),$request]);$response->end('你好,Swoole');});$服务器->开始();});这样就可以直接使用Http\ResponseAPI进行响应处理,而不是自己组装HTTP协议响应数据。isWritableisWritable()用于判断Http\Response对象是否结束(end)或分离(detach),例如:useSwoole\Http\Server;useSwoole\Http\Request;useSwoole\Http\Response;$http=newServer('0.0.0.0',9501);$http->on('request',function(Request$req,Response$resp){assert($resp->isWritable(),true);$resp->结束('你好');断言($resp->isWritable(),假);$resp->setStatusCode(403);});$http->开始();如果调用end()后调用相关API,会报错PHPWarning:Swoole\Http\Response::setStatusCode():httpresponseisunavailable(maybeithasbeenendedordetached)
