class WS
{
protected $server;
public function __construct()
{
$this->server = new swoole_websocket_server('0.0.0.0', '8888');
$this->server->set([
'document_root'=>'/www/swoole/tp5/public/static',
'enable_static_handler'=>true,
'worker_num'=>4
]);
// 基础文件常驻内存
$this->server->on('WorkerStart', function ($server, $worker_id) {
require __DIR__ . '/../thinkphp/base.php';
});
$this->server->on('request', function ($request, $response) {
ob_start();
$this->initializeGlobalVariables($request);
try {
think\Container::get('app')->run()->send();
} catch (Exception $e) {
echo $e->getMessage();
}
$contents = ob_get_contents();
ob_end_clean();
//
$response->end($contents);
$this->server->close($request->fd);
//
// $this->server->close($request->fd);
});
$this->server->on('open', function () {
});
$this->server->on('message', function () {
});
$this->server->on('close', function () {
echo "server关闭了\n";
});
$this->server->start();
}
// 初始化全局变量
protected function initializeGlobalVariables($request)
{
$_GET = [];
$_POST = [];
if(isset($request->server)) {
foreach($request->server as $key => $v
alue) {
$_SERVER[strtoupper($key)] = $value;
}
}
if(isset($request->header)) {
foreach($request->header as $key => $value) {
$_SERVER[strtoupper($key)] = $value;
}
}
if(isset($request->get)) {
foreach($request->get as $key => $value) {
$_GET[$key] = $value;
}
}
if(isset($request->post)) {
foreach($request->post as $key => $value) {
$_POST[$key] = $value;
}
}
}
}
new WS();
在swoole onWorkerStart回调里面加载框架基本文件,响应请求放到onRequest回调里面,我感觉访问控制器是通过路由解析访问到的,不应该在我改动控制器或者模型代码的时候需要重新重启server啊,可是实际上我每次都需要重新启动swoole serverr,老师之前说的在request里面调用$server->close方法可以解决这个问题,但是server报错,我是想了解一下,有没有更好的解决方式~~