• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP swoole中http_server的配置与使用方法实例分析

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

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

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

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

    ?php
    //创建一个http server服务
    $server = new swoole_http_server('0.0.0.0', 8888);
     
    $server->set([
      'package_max_length' => 1024 * 1024 * 10,
      //设置文件上传的临时目录
      'upload_tmp_dir' => __DIR__ . '/uploads/',
    ]);
     
    //设置request事件回调
    //函数有两个参数:
    //swoole_http_request对象,负责http请求相关信息
    //swoole_http_response对象,负责向客户端响应相关信息
    $server->on('request', function (swoole_http_request $request, swoole_http_response $response) {
      //请求的头部信息
      var_dump($request->header);
     
      //请求相关的服务器信息,相当于PHP中的$_SERVER
      var_dump($request->server);
     
      //请求的GET参数,相当于PHP中的$_GET
      var_dump($request->get);
     
      //请求的POST参数,相当于PHP中的$_POST
      var_dump($request->post);
     
      //请求的COOKIE信息
      var_dump($request->cookie);
     
      //文件上传信息,文件大小不超过package_max_length的值
      var_dump($request->files);
     
      //获取原始POST请求数据,相当于fopen('php://input');
      var_dump($request->rawContent());
     
      //获取完整http请求报文
      var_dump($request->getData());
     
      //向客户端发送信息
      $response->end('hello');
    });
     
    //启动服务
    $server->start();
    
    

    二、处理静态文件

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

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

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

    三、处理文件上传

    ?php
    //创建一个http server服务
    $server = new swoole_http_server('0.0.0.0', 8888);
     
    $server->set([
      //文件上传大小不超过该值
      'package_max_length' => 1024 * 1024 * 50,
      //设置文件上传的临时目录
      'upload_tmp_dir' => __DIR__ . '/tmp/',
      'upload_dir' => __DIR__ . '/uploads/',
      'document_root' => __DIR__ . '/statics/',
      'enable_static_handler' => true,
    ]);
     
    $server->on('request', function ($request, $response) use ($server) {
      if ($request->server['path_info'] == '/upload') {
        $tmp = $request->files['upload']['tmp_name'];
        $upload = $server->setting['upload_dir'] . $request->files['upload']['name'];
        if (file_exists($tmp) 
          move_uploaded_file($tmp, $upload)) {
          $response->header('Content-Type', 'text/html; charset=UTF-8');
          $response->end('上传成功');
        } else {
          $response->end('上传失败');
        }
      }
    });
     
    //启动服务
    $server->start();
    
    

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

    !doctype html>
    html lang="zh-CN">
    head>
      meta charset="UTF-8">
      title>文件上传/title>
    /head>
    body>
    form action="/upload" method="post" enctype="multipart/form-data">
      input type="file" name="upload" value="">
      input type="submit" value="提交">
    /form>
    /body>
    /html>
    
    

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

    ?php
    //创建一个http server服务
    $server = new swoole_http_server('0.0.0.0', 8888);
     
    $server->set([
      //配置项目的目录
      'project_path' => __DIR__ . '/src/',
    ]);
     
    $server->on('WorkerStart', function ($server, $worker_id) {
      //注册自动加载函数
      spl_autoload_register(function ($class) use($server) {
        $class = $server->setting['project_path'] . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
     
        if (file_exists($class)) {
          include_once $class;
        }
      });
    });
     
    $server->on('request', function ($request, $response) use ($server) {
      $pathInfo = explode('/', ltrim($request->server['path_info'], '/'));
     
      //模块/控制器/方法
      $module = $pathInfo[0] ?? 'Index';
      $controller = $pathInfo[1] ?? 'Index';
      $method = $pathInfo[2] ?? 'index';
     
      try {
        $class = "\\{$module}\\{$controller}";
        $result = (new $class)->{$method}();
        $response->end($result);
      } catch (\Throwable $e) {
        $response->end($e->getMessage());
      }
    });
     
    //启动服务
    $server->start();
    
    

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

    ?php
    namespace Test;
     
    class Test
    {
      public function test()
      {
        return 'test';
      }
    }
    
    

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

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

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

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

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP网络编程技巧总结》、《php socket用法总结》、《php面向对象程序设计入门教程》、《PHP数据结构与算法教程》及《php程序设计算法总结》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • 详解PHP Swoole长连接常见问题
    • 详解PHP Swoole与TCP三次握手
    • 详解PHP7开启OPcache和Swoole性能的提升对比
    • php中Swoole的热更新实现代码实例
    • windows系统php环境安装swoole具体步骤
    • php使用Swoole实现毫秒级定时任务的方法
    • php使用goto实现自动重启swoole、reactphp、workerman服务的代码
    • PHP swoole的process模块创建和使用子进程操作示例
    • PHP swoole中使用task进程异步的处理耗时任务应用案例分析
    • 浅谈swoole的作用与原理
    上一篇:PHP swoole中使用task进程异步的处理耗时任务应用案例分析
    下一篇:PHP swoole的process模块创建和使用子进程操作示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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