1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <?php $http = new swoole_http_server( "0.0.0.0" , 9911); $http ->set( [ 'enable_static_handler' => true, 'document_root' => "/home/wwwroot/swoole/thinkphp/public/static" , 'worker_num' => 5, ] ); //此事件在Worker进程/Task进程启动时发生,这里创建的对象可以在进程生命周期内使用 $http ->on( 'WorkerStart' , function (swoole_server $server , $worker_id ) { // 定义应用目录 define( 'APP_PATH' , __DIR__ . '/../application/' ); // 加载框架里面的文件 require __DIR__ . '/../../../../thinkphp/base.php' ; }); $http ->on( 'request' , function ( $request , $response ) use ( $http ){ /** * 解决上一次输入的变量还存在的问题 * 方案一:if(!empty($_GET)) {unset($_GET);} * 方案二:$http-close();把之前的进程kill,swoole会重新启一个进程,重启会释放内存,把上一次的资源包括变量等全部清空 * 方案三:$_SERVER = [] */ //$_SERVER = []; if (isset( $request ->server)) { foreach ( $request ->server as $k => $v ) { $_SERVER [ strtoupper ( $k )] = $v ; } } if (isset( $request ->header)) { foreach ( $request ->header as $k => $v ) { $_SERVER [ strtoupper ( $k )] = $v ; } } //$_GET = []; if (isset( $request ->get)) { foreach ( $request ->get as $k => $v ) { $_GET [ $k ] = $v ; } } //$_POST = []; if (isset( $request ->post)) { foreach ( $request ->post as $k => $v ) { $_POST [ $k ] = $v ; } } //开启缓冲区 ob_start(); // 执行应用并响应 try { think\Container::get( 'app' , [APP_PATH]) ->run() ->send(); } catch (\Exception $e ) { // todo } //输出TP当前请求的控制方法 //echo "-action-".request()->action().PHP_EOL; //获取缓冲区内容 $res = ob_get_contents(); ob_end_clean(); $response -> end ( $res ); //把之前的进程kill,swoole会重新启一个进程,重启会释放内存,把上一次的资源包括变量等全部清空 $http ->close(); }); $http ->start(); |
老师$http->close();把上一次的资源包括变量等全部清空,如果close了,为什么再次请求浏览器还可以执行成功,不应该把服务给关了吗?这个和php php_server.php没有关系吗?感觉有点绕~