public function __construct($opt, $config = 'default')
 {
     $this->webPath = $opt['path'];
     if (!empty($opt['config'])) {
         $this->configPath = $opt['config'];
     }
     $ip = empty($opt['ip']) ? '0.0.0.0' : $opt['ip'];
     $port = empty($opt['port']) ? '9501' : $opt['port'];
     $http = new swoole_websocket_server($ip, $port);
     if (isset($opt['d'])) {
         $daemonize = 1;
     } else {
         $daemonize = 0;
     }
     $worker_num = empty($opt['worker']) ? 4 : $opt['worker'];
     $http->set(array('worker_num' => $worker_num, 'daemonize' => $daemonize, 'max_request' => 0));
     $http->setGlobal(HTTP_GLOBAL_ALL, HTTP_GLOBAL_GET | HTTP_GLOBAL_POST);
     $http->on('WorkerStart', array($this, 'onWorkerStart'));
     $http->on('WorkerError', array($this, 'onWorkerError'));
     $http->on('WorkerStop', array($this, 'onWorkerStop'));
     $http->on('close', function () {
         $params = func_get_args();
         $conn = $params[0]->connection_info($params[1]);
         if ($conn['websocket_status'] > 1) {
             $parse = ZFactory::getInstance(ZConfig::getField('socket', 'parse_class', 'WebSocketChatParse'));
             $parse->close($this->zphp, $params[1]);
         }
     });
     $http->on('open', function ($response) {
         $parse = ZFactory::getInstance(ZConfig::getField('socket', 'parse_class', 'WebSocketChatParse'));
         $parse->open($this->zphp, $response->fd);
     });
     $http->on('message', function ($server, $frame) {
         HttpServer::$wsfarme = $frame;
         $parse = ZFactory::getInstance(ZConfig::getField('websocket', 'parse_class', 'WebSocketChatParse'));
         $parse->message($this->zphp, $frame);
     });
     $http->on('request', function ($request, $response) {
         HttpServer::$request = $request;
         HttpServer::$response = $response;
         $_SERVER['PATH_INFO'] = $request->server['path_info'];
         if ($_SERVER['PATH_INFO'] == '/') {
             if (!empty($this->defaultFiles)) {
                 foreach ($this->defaultFiles as $file) {
                     $staticFile = $this->getStaticFile(DIRECTORY_SEPARATOR . $file);
                     if (is_file($staticFile)) {
                         $response->end(file_get_contents($staticFile));
                         return;
                     }
                 }
             }
         }
         if ($_SERVER['PATH_INFO'] == '/favicon.ico') {
             $response->header('Content-Type', $this->mimes['ico']);
             $response->end('');
             return;
         }
         $staticFile = $this->getStaticFile($_SERVER['PATH_INFO']);
         if (\is_dir($staticFile)) {
             //是目录
             foreach ($this->defaultFiles as $file) {
                 if (is_file($staticFile . $file)) {
                     $response->header('Content-Type', 'text/html');
                     $response->end(file_get_contents($staticFile . $file));
                     return;
                 }
             }
         }
         $ext = \pathinfo($_SERVER['PATH_INFO'], PATHINFO_EXTENSION);
         if (isset($this->mimes[$ext])) {
             //非法的扩展名
             if (\is_file($staticFile)) {
                 //读取静态文件
                 $response->header('Content-Type', $this->mimes[$ext]);
                 $response->end(file_get_contents($staticFile));
                 return;
             } else {
                 $response->status(404);
                 $response->end('');
                 return;
             }
         }
         try {
             ob_start();
             $result = $this->zphp->run();
             if (null == $result) {
                 $result = ob_get_contents();
             }
             ob_end_clean();
         } catch (Exception $e) {
             $result = json_encode($e->getTrace());
         }
         $response->status(200);
         $response->end($result);
     });
     self::$http = $http;
     self::$http->start();
 }
Beispiel #2
0
 /**
  * 构造方法,要执行的东西很多
  * @author xuebing<*****@*****.**>
  */
 public function __construct()
 {
     $config = new Yaf\Config\Ini(CONF_PATH . 'swoole.ini');
     $config = $config->get('swoole');
     self::$http = new swoole_http_server("0.0.0.0", $config->port);
     self::$http->set(array('worker_num' => $config->worker_num, 'max_conn' => $config->max_conn, 'max_request' => $config->max_request, 'ipc_mode' => $config->ipc_mode, 'task_worker_num' => $config->task_worker_num, 'task_ipc_mode' => $config->task_ipc_mode, 'task_max_request' => $config->task_max_request, 'dispatch_mode' => $config->dispatch_mode, 'daemonize' => $config->daemonize, 'backlog' => $config->backlog, 'open_tcp_keepalive' => $config->open_tcp_keepalive, 'tcp_defer_accept' => $config->tcp_defer_accept, 'open_tcp_nodelay' => $config->open_tcp_nodelay, 'log_file' => APP_PATH . '/log/swoole.log'));
     self::$http->on('request', function ($request, $response) {
         if (isset($request->post)) {
             self::$post = $request->post;
         }
         self::$raw_data = $request->rawContent();
         echo "[" . date('Y-m-d H:i:s') . "]" . PHP_EOL . "请求地址==>" . $request->server['request_uri'] . PHP_EOL . "请求内容==>" . self::$raw_data . PHP_EOL;
         if (self::$raw_data == 'swoole_reload()') {
             self::$http->reload();
             $response->end('reload success');
             return;
         }
         try {
             // TODO handle
             $yaf_response = $this->application->getDispatcher()->dispatch(new Yaf\Request\Http($request->server['request_uri']));
             $result = $yaf_response->getBody();
         } catch (\Exception $e) {
             $result = array();
             $result['err_code'] = $e->getCode();
             $result['err_msg'] = $e->getMessage();
             $result = json_encode($result, JSON_UNESCAPED_UNICODE);
         }
         echo "返回内容==>" . $result . PHP_EOL . PHP_EOL;
         $response->end($result);
     });
     self::$http->on('Finish', function ($serv, $task_id, $data) {
         echo "异步任务完成[{$task_id}],data:" . $data . PHP_EOL;
     });
     self::$http->on('Task', function ($serv, $task_id, $from_id, $data) {
         echo "新的异步任务[来自进程 {$from_id},当前进程 {$task_id}],data:" . $data . PHP_EOL;
         $data = unserialize($data);
         if (is_array($data)) {
             list($module, $controller, $action, $params) = $data;
             $request = new Yaf\Request\Simple('CLI', $module, $controller, $action, $params);
             $this->application->getDispatcher()->dispatch($request);
             $serv->finish("task -> OK");
         }
     });
     self::$http->on('Timer', function ($serv, $interval) {
         switch ($interval) {
             case 300000:
                 break;
         }
     });
     self::$http->on('Start', function ($serv) {
         cli_set_process_title("swoolehttp:main");
         file_put_contents(APP_PATH . '/log/swoole-master.pid', $serv->master_pid);
     });
     self::$http->on('WorkerStart', array($this, 'onWorkerStart'));
     self::$http->on('ManagerStart', function ($serv) {
         cli_set_process_title("swoolehttp:manager");
         file_put_contents(APP_PATH . '/log/swoole-manager.pid', $serv->master_pid);
     });
     self::$http->on('Shutdown', function ($serv) {
         echo 'Shutdown' . PHP_EOL;
     });
     self::$http->on('WorkerError', function ($serv, $worker_id, $worker_pid, $exit_code) {
     });
     self::$http->start();
 }