Swoole支持Thinkphp5以及短信验证码

思路:使用Swoole搭建本地服务器,并加载TP中的文件(即入口文件)

原本TP5框架public目录下的index.php文件

对应的start.php

base.php为实现初始化各种模块

(载入Loader类/注册自动加载/注册错误和异常处理机制……)

此部分为执行并响应

我们需要的是通过http_server开启服务后

通过ip+端口/模块/控制器 访问


1.需要把此处加载的文件在搭建服务器时加载(此处在onWorkStart中加载)

public function onWorkerStart($server, $worker_id) {
    //用于后期使用异步,连接对象
    $_POST['http_server'] = $this->http;
    // 定义应用目录
    define('APP_PATH', __DIR__ . '/../application/');
    //加载框架里的文件
    require __DIR__ . '/../thinkphp/start.php';
    //引入start默认访问index/index/index 需要在第一个控制器return ;
    //不在此处引入的话,task中的类库无法使用
}

开启服务后,通过地址加端口会执行request()回调函数中的逻辑

创建http_server会自动执行workerstart()回调函数中的逻辑

2.把响应模块放在request

等到通过浏览器访问模块才需加载,所以响应模块放在request

public function onRequest($request, $response) {
    $_SERVER = [];
    if(isset($request->server)){
        foreach ($request->server as $k => $v) {
            $_SERVER[strtoupper($k)] = $v;
        }
    }

    if(isset($request->header)){
        foreach ($request->header as $k => $v) {
            $_SERVER[strtoupper($k)] = $v;
        }
    }

    $_GET = [];
    if(isset($request->get)){
        foreach ($request->get as $k => $v) {
            $_GET[$k] = $v;
        }
    }

    $_POST = [];
    if(isset($request->post)){
        foreach ($request->post as $k => $v) {
            $_POST[$k] = $v;
        }
    }

    //存入http对象,用于使用tack
    $_POST['http_server'] = $this->http;

    ob_start();//开启缓冲,脚本内容不会输出页面,保存在缓冲区
    
    // 执行应用并响应,此处没有命名空间
    try{
        think\Container::get('app', [APP_PATH]) //app.php/run->run()->send();
    }catch (\Exception $e){
        //todo
    }
    
    $res = ob_get_contents();
    ob_end_clean();
    $response->end($res);
}

此部分为:通过swoole_http_server访问,server信息在$request

一般通过TP访问(原生php),服务器信息放在$_SERVER中,

需要做下转换。


修改访问刷新控制器不变问题

路径为:

thinkphp->library->think->App.php

查找function run

function routeCheck

同级目录下的request.php

查找function path

注销is_null($this->path)

查找function pathinfo

注销is_null($this->pathinfo)

使得pathinfo能够正常访问,在request.php下的pathinfo添加:

if(isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO']!= '/'){
    return ltrim($_SERVER['PATH_INFO'], '/');
}

去掉'/',返回地址


测试案例

swoole缓存

建立一个swoole_http_server后,在没关闭之前会导致第一次访问的信息保存在缓存中,影响下次访问

(改变控制器和模块和get后)访问内容不变或是受到影响

可以在get之前     

if(!empry($_GET)){
    unset($_GET);
}

直接$http->close();

PS:TP中输出控制器信息 echo request()->action();


短信验证码登录

登录阿里大鱼->短信服务(申请签名以及模板)->下载(demo以及SDK)

项目中发送短信代码如此:

$response = Sms::sendSms($data['phone'], $data['code']);

Sms.php(为下载demo)

需要安装curl扩展

  1. 下载安装包(放在softpack)
  2. 解压并./configure --prefix=/usr/local/curl
  3. 直接用 phpize 会提示没有config.m4
  4. 进入php源码目录,即压缩包解压目录,进入其中的ext/curl

执行 /home/work/study/soft/php/bin/phpize 接下

./configure --with-php-config=/home/work/study/soft/php/bin/php-config --with-curl=/usr/local/curl

make & make install

之后在php.ini开启扩展即可

https://www.cnblogs.com/jcblog/p/7966929.html

发送短信请先往平台充点钱

登录页面(login.html)

send.php

安装redis同步扩展

下载:https://github.com/phpredis/phpredis/

其余跟安装swoole一样

写入redis数据错误

善用try{}catch(\Exception $e){  var_dump($e);  }

发现是需要关闭安全模式

修改redis安装目录下redis.conf

1) 绑定IP地址,看业务开放

bind 0.0.0.0

2)Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程,设置为no

daemonize no

3)保护模式

protected-mode no

之后再执行

/usr/local/redis/bin/redis-server  /usr/local/redis/conf/redis6379.conf (一起执行)

此种修改方式貌似只是暂时生效(重启就无效了)

可用task机制发送短信防止卡住让用户等待

猜你喜欢

转载自blog.csdn.net/qq_36289732/article/details/82624392