186 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| /**
 | ||
|  * Http服务端类
 | ||
|  * User: fantasticbin
 | ||
|  * Date: 2020/1/15
 | ||
|  */
 | ||
| class Http
 | ||
| {
 | ||
|     const HOST = '0.0.0.0';
 | ||
|     const PORT = 8080;
 | ||
|     protected $read_num = null;
 | ||
| 
 | ||
|     public $server = null;
 | ||
| 
 | ||
|     public function __construct()
 | ||
|     {
 | ||
|         // 创建Http服务器,监听本机的所有地址并监听 8080 端口
 | ||
|         $this->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 = <<<EOT
 | ||
| <h1>Hello Swoole.</h1>
 | ||
| <h2>The get request is {$get}</h2>
 | ||
| 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(); | 
