服务端代码

http_server.php

  1. <?php
  2. // 参数1 : 监听的IP地址
  3. // 参数2 : 监听的端口
  4. $server = new Swoole\Http\Server('0.0.0.0', 9505);
  5. // HTTP 服务器只需要关注请求响应即可,所以只需要监听一个 onRequest 事件。
  6. // 当有新的 HTTP 请求进入就会触发此事件。
  7. // $request 对象,包含了请求的相关信息,如 GET/POST 请求的数据。
  8. $server->on('request', function($request, $response){
  9. // 为了解决 chrome 请求两次的问题
  10. if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') {
  11. $response->end();
  12. return;
  13. }
  14. echo '<pre>';
  15. var_dump($request->get, $request->post);
  16. // 设置返回的响应头信息
  17. $response->header("Content-type", 'text/html;charset=utf-8');
  18. // 表示输出一段 HTML 内容,并结束此请求。
  19. $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
  20. });
  21. $server->start();
  22. ?>

客户端

客户端访问 : http://192.168.8.128:9505/?id=2 , 其中 192.168.8.128 替换成你本地的 ip 地址, 就可以执行一个 http请求.

执行结果

  1. [root@localhost wwwroot]# php http_server.php
  2. <pre>array(1) {
  3. ["id"]=>
  4. string(1) "2"
  5. }
  6. NULL

Chrome请求两次

使用 Chrome 浏览器访问服务器,会产生额外的一次请求,/favicon.ico,可以在代码中响应 404 错误。

  1. $http->on('request', function ($request, $response) {
  2. if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') {
  3. $response->end();
  4. return;
  5. }
  6. var_dump($request->get, $request->post);
  7. $response->header("Content-Type", "text/html; charset=utf-8");
  8. $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
  9. });

URL 路由

应用程序可以根据 $request->server['request_uri'] 实现路由。如:http://127.0.0.1:9501/test/index/?a=1,代码中可以这样实现 URL 路由。

  1. $http->on('request', function ($request, $response) {
  2. // trim($request->server['request_uri'], '/') = test/index
  3. list($controller, $action) = explode('/', trim($request->server['request_uri'], '/'));
  4. // 根据 $controller, $action 映射到不同的控制器类和方法
  5. (new $controller)->$action($request, $response);
  6. });