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

吾爱主题 阅读:141 2021-10-06 13:40:00 评论:0

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

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

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

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <?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中已经帮我们内置了两个配置参数,只需要简单配置一下就可以实现。

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?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();

三、处理文件上传

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?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文件:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 <!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 >

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <?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 文件

?
1 2 3 4 5 6 7 8 9 10 <?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程序设计有所帮助。

原文链接:https://www.cnblogs.com/jkko123/p/10911637.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容