public function actionRun($hostinfo = '0.0.0.0:9580') { $this->parseHostPort($hostinfo); $http = new \swoole_http_server($this->host, $this->port); //初始化进程数 ,关联getTaskId函数的使用 $task_num = 0; foreach (self::$q_config as $key => $val) { self::$event_base[$key] = $task_num; self::$cnt[$key] = 0; $task_num += $val; } //初始化配置 $this->config['task_worker_num'] = $task_num; $http->set($this->config); //接受http请求参数 $http->on('request', function ($request, $response) use($http) { if (!isset($request->get['opt'])) { $response->end('HTTP_OPT_ERROR:missing opt'); return; } $opt = $request->get['opt']; if ($opt == 'put') { //获取data数据 if (isset($request->get['data'])) { $data = $request->get['data']; } elseif (isset($request->post['data'])) { $data = $request->post['data']; } else { $response->end('HTTP_PARAM_ERROR:missing data'); return; } $data = json_decode($data, true); if (json_last_error() != JSON_ERROR_NONE) { $response->end(json_last_error_msg()); return; } if (!isset($data['class']) || !isset(self::$q_config[$data['class']])) { $type = 'Common'; } else { $type = $data['class']; } $taskId = $this->getTaskId($type); if (!isset($data['task'])) { $response->end('HTTP_PARAM_ERROR:missing task'); return; } //分配给task的worker $http->task($data, $taskId); $response->end("HTTP_PUT_OK"); } elseif ($opt == 'reload') { $http->reload(); $response->end('reset now!'); return; } elseif ($opt == 'shutdown') { $http->shutdown(); $response->end('shutdown now!'); return; } else { $response->end("HTTP_OPT_ERROR:nothing to do"); return; } }); //任务调度 $http->on('Task', function ($http, $taskId, $fromId, $data) { $rs = $this->doJob($data); return $rs; }); //任务完成的响应事件 $http->on('Finish', function ($http, $taskId, $data) { echo "finish task,the result:" . $data . "\n"; }); $http->start(); }
<?php function mylog($msg, $filename = 'hook_error') { error_log(date("Y-m-d H:i:s") . "\t" . $msg . PHP_EOL, 3, __DIR__ . DIRECTORY_SEPARATOR . $filename . '.mylog'); } define('PASSWORD', ''); $config = null; $http = new swoole_http_server("0.0.0.0", 9501); $http->set(['worker_num' => 4, 'daemonize' => 1]); $http->on('request', function ($request, $response) { $response->end('ok'); if (false !== strpos($request->server['path_info'], 'reload')) { global $http; $http->reload(); return; } if (empty($request->post['hook'])) { mylog('hook data empty'); return; } $data = json_decode($request->post['hook'], true); if (empty($data)) { //错误的数据 mylog('hook no json data'); return; } if (PASSWORD && $data['password'] != PASSWORD) { //密码不匹配 mylog('password error'); return;
/** * 构造方法,要执行的东西很多 * @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(); }