server = new Swoole\Http\Server(self::HOST, self::PORT); // 设置响应html文件模式以及定义路径 $this->server->set([ 'worker_num' => 2, 'enable_static_handler' => true, 'document_root' => dirname(dirname(__FILE__)) . '/Template' ]); // 设置异步AIO线程数量 swoole_async_set([ 'thread_num' => 10, ]); // 监听启动 $this->server->on('Start', [$this, 'onStart']); // 监听请求并输出内容 $this->server->on('Request', [$this, 'onRequest']); } /** * 监听启动,修改主进程名称,便于执行平滑重启 */ public function onStart() { swoole_set_process_name('http_server'); } /** * 监听请求并输出内容 * @param $request object 请求对象 * @param $response object 响应对象 */ public function onRequest($request, $response) { // 优化请求,防止图标再次请求浪费资源 if ($request->server['request_uri'] == '/favicon.ico') { $response->status(404); $response->end(); return ; } $get = json_encode($request->get); $html = <<Hello Swoole.

The get request is {$get}

EOT; // 记录访问日志 $log = [ 'time' => date('Y-m-d H:i:s'), 'get' => $request->get, 'post' => $request->post, 'header' => $request->header ]; if (!is_dir(__DIR__ . '/log')) { mkdir(__DIR__ . '/log'); } Swoole\Async::writeFile(__DIR__ . '/log/access.log', json_encode($log) . PHP_EOL, function($filename) {}, FILE_APPEND); // 在MySQL数据库中增加访问量 $this->addReadNum(); // 读取redis里的访问量数据,如无则从常量中定义 $this->getReadNum(); // 设置响应头信息 $response->header('Content-Type', 'text/html; charset=utf-8'); // 设置cookie信息 $response->cookie('code', 'Hello world', time() + 1800); // 输出显示内容 $response->end($html); } /** * 增加访问量方法 */ public function addReadNum() { $update_db = new Swoole\Coroutine\MySQL(); $select_db = new Swoole\Coroutine\MySQL(); $config = [ 'host' => '127.0.0.1', 'port' => 3306, 'user' => 'swoole', 'password' => 'Zhang1994)!)(', 'database' => 'swoole', 'charset' => 'utf8mb4', 'timeout' => 2 ]; // 进行MySQL数据库连接 $conn_res = $select_db->connect($config); if ($conn_res === false) { echo 'MySQL connect error!' . PHP_EOL; var_dump($select_db->connect_errno, $select_db->connect_error) . PHP_EOL; throw new Swoole\ExitException('program exit.'); } // 获取到访问量的数据 $result = $select_db->query('SELECT read_num FROM test WHERE id = 1'); if ($result !== false) { if (isset($result[0]['read_num'])) $this->read_num = $result[0]['read_num']; echo 'MySQL execute success, data: ' . PHP_EOL; var_dump($result); } // 一定要记得关闭MySQL连接 $select_db->close(); // 进行MySQL数据库连接,这里是并发再开启一个MySQL连接进程 $conn_res = $update_db->connect($config); if ($conn_res === false) { echo 'MySQL connect error!' . PHP_EOL; var_dump($update_db->connect_errno, $update_db->connect_error) . PHP_EOL; throw new Swoole\ExitException('program exit.'); } // 执行增加访问量的语句并处理结果 $result = $update_db->query('UPDATE test SET read_num = read_num + 1 WHERE id = 1'); if ($result !== false) { echo 'MySQL execute success, affected rows: ' . $update_db->affected_rows . ', insert id: ' . $update_db->insert_id . PHP_EOL; } // 一定要记得关闭MySQL连接 $update_db->close(); } /** * 读取redis里的访问量数据,如无则从常量中定义 */ public function getReadNum() { $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6379); $read_num = $redis->get('read_num'); if (empty($read_num)) { if (!isset($this->read_num)) { throw new Swoole\ExitException('Read num not exist!'); } $read_num = $this->read_num; $redis->set('read_num', $read_num); echo 'The data from MySQL.' . PHP_EOL; } else { echo 'The data from Redis.' . PHP_EOL; } echo "The redis read num is: {$read_num}"; } /** * 启动Http服务器 */ public function start() { $this->server->start(); } } $http = new Http(); $http->start();