当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP swoole中http_server的配置与使用方法实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-19 09:36:25 浏览: 评论:0 

本文实例讲述了PHP swoole中http_server的配置与使用方法,分享给大家供大家参考,具体如下:

swoole中为我们提供了一个swoole_http_server类,方便我们处理http请求。

但是它对http协议的支持并不完整,所以一般建议在前面加一层nginx进行代理,对于php文件的处理交由swoole处理。

一、创建一个简单的http服务

  1. <?php 
  2. //创建一个http server服务 
  3. $server = new swoole_http_server('0.0.0.0', 8888); 
  4.    
  5. $server->set([ 
  6.   'package_max_length' => 1024 * 1024 * 10, 
  7.   //设置文件上传的临时目录 
  8.   'upload_tmp_dir' => __DIR__ . '/uploads/'
  9. ]); 
  10.    
  11. //设置request事件回调 
  12. //函数有两个参数: 
  13. //swoole_http_request对象,负责http请求相关信息 
  14. //swoole_http_response对象,负责向客户端响应相关信息 
  15. $server->on('request'function (swoole_http_request $request, swoole_http_response $response) { 
  16.   //请求的头部信息 
  17.   var_dump($request->header); 
  18.    
  19.   //请求相关的服务器信息,相当于PHP中的$_SERVER 
  20.   var_dump($request->server); 
  21.    
  22.   //请求的GET参数,相当于PHP中的$_GET 
  23.   var_dump($request->get); 
  24.    
  25.   //请求的POST参数,相当于PHP中的$_POST 
  26.   var_dump($request->post); 
  27.    
  28.   //请求的COOKIE信息 
  29.   var_dump($request->cookie); 
  30.    
  31.   //文件上传信息,文件大小不超过package_max_length的值 
  32.   var_dump($request->files); 
  33.    
  34.   //获取原始POST请求数据,相当于fopen('php://input'); 
  35.   var_dump($request->rawContent()); 
  36.    
  37.   //获取完整http请求报文 
  38.   var_dump($request->getData()); 
  39.    
  40.   //向客户端发送信息 
  41.   $response->end('hello'); 
  42. }); 
  43.    
  44. //启动服务 
  45. $server->start(); 

二、处理静态文件

swoole中已经帮我们内置了两个配置参数,只需要简单配置一下就可以实现。

不过功能简易,不建议外网使用,有需求的可以自已实现。

  1. <?php 
  2. $server = new swoole_http_server('0.0.0.0', 8888); 
  3.    
  4. $server->set([ 
  5.   //配置静态文件根目录 
  6.   'document_root' => __DIR__ . '/statics/'
  7.   //开启静态文件请求处理功能,这样当请求的是一个静态文件时,swoole自动会在上面配置的目录中查找并返回 
  8.   'enable_static_handler' => true, 
  9. ]); 
  10.    
  11. $server->on('request'function ($request$response) { 
  12.    
  13. }); 
  14.    
  15. $server->start(); 

三、处理文件上传

  1. <?php 
  2. //创建一个http server服务 
  3. $server = new swoole_http_server('0.0.0.0', 8888); 
  4.    
  5. $server->set([ 
  6.   //文件上传大小不超过该值 
  7.   'package_max_length' => 1024 * 1024 * 50, 
  8.   //设置文件上传的临时目录 
  9.   'upload_tmp_dir' => __DIR__ . '/tmp/'
  10.   'upload_dir' => __DIR__ . '/uploads/'
  11.   'document_root' => __DIR__ . '/statics/'
  12.   'enable_static_handler' => true, 
  13. ]); 
  14.    
  15. $server->on('request'function ($request$responseuse ($server) { 
  16.   if ($request->server['path_info'] == '/upload') { 
  17.     $tmp = $request->files['upload']['tmp_name']; 
  18.     $upload = $server->setting['upload_dir'] . $request->files['upload']['name']; 
  19.     if (file_exists($tmp) && 
  20.       move_uploaded_file($tmp$upload)) { 
  21.       $response->header('Content-Type''text/html; charset=UTF-8'); 
  22.       $response->end('上传成功'); 
  23.     } else { 
  24.       $response->end('上传失败'); 
  25.     } 
  26.   } 
  27. }); 
  28.    
  29. //启动服务 
  30. $server->start(); 

我们在statics目录下创建一个upload.html文件:

  1. <!doctype html> 
  2. <html lang="zh-CN"> 
  3. <head> 
  4.   <meta charset="UTF-8"> 
  5.   <title>文件上传</title> 
  6. </head> 
  7. <body> 
  8. <form action="/upload" method="post" enctype="multipart/form-data"> 
  9.   <input type="file" name="upload" value=""> 
  10.   <input type="submit" value="提交"> 
  11. </form> 
  12. </body> 
  13. </html> 

四、处理路由文件自动加载

  1. <?php 
  2. //创建一个http server服务 
  3. $server = new swoole_http_server('0.0.0.0', 8888); 
  4.    
  5. $server->set([ 
  6.   //配置项目的目录 
  7.   'project_path' => __DIR__ . '/src/'
  8. ]); 
  9.    
  10. $server->on('WorkerStart'function ($server$worker_id) { 
  11.   //注册自动加载函数 
  12.   spl_autoload_register(function ($classuse($server) { 
  13.     $class = $server->setting['project_path'] . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php'; 
  14.    
  15.     if (file_exists($class)) { 
  16.       include_once $class
  17.     } 
  18.   }); 
  19. }); 
  20.    
  21. $server->on('request'function ($request$responseuse ($server) { 
  22.   $pathInfo = explode('/', ltrim($request->server['path_info'], '/')); 
  23.    
  24.   //模块/控制器/方法 
  25.   $module = $pathInfo[0] ?? 'Index'
  26.   $controller = $pathInfo[1] ?? 'Index'
  27.   $method = $pathInfo[2] ?? 'index'
  28.    
  29.   try { 
  30.     $class = "\\{$module}\\{$controller}"
  31.     $result = (new $class)->{$method}(); 
  32.     $response->end($result); 
  33.   } catch (\Throwable $e) { 
  34.     $response->end($e->getMessage()); 
  35.   } 
  36. }); 
  37.    
  38. //启动服务 
  39. $server->start(); 

我们在目录 src 下创建 test 目录,并创建 test.php 文件

  1. <?php 
  2. namespace Test; 
  3.    
  4. class Test 
  5.   public function test() 
  6.   { 
  7.     return 'test'
  8.   } 

然后访问 127.0.0.1:8888/test/test/test 就可以看到返回结果了。

通过$request->server['path_info'] 来找到模块,控制器,方法,然后注册我们自已的加载函数,引入文件。实例化类对象,然后调用方法,返回结果。

注意,不要将 spl_autoload_register 放到 onStart 事件回调函数中。

onStart 回调中,仅允许echo、打印Log、修改进程名称。不得执行其他操作。

Tags: swoole http_server

分享到: