欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swoole支持Thinkphp5以及短信验证码

程序员文章站 2022-05-18 16:01:56
...

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

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

Swoole支持Thinkphp5以及短信验证码

 

对应的start.php

Swoole支持Thinkphp5以及短信验证码

 

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

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

Swoole支持Thinkphp5以及短信验证码

此部分为执行并响应

我们需要的是通过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

Swoole支持Thinkphp5以及短信验证码

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支持Thinkphp5以及短信验证码

Swoole支持Thinkphp5以及短信验证码

 

swoole缓存

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

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

 

可以在get之前     

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

直接$http->close();

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


短信验证码登录

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

Swoole支持Thinkphp5以及短信验证码

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

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

Sms.php(为下载demo)

 

Swoole支持Thinkphp5以及短信验证码

Swoole支持Thinkphp5以及短信验证码

需要安装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

 

此方式安装不成功可以尝试以下方式:

apt-cache search curl | grep php          //查询curl的php支持名字

sudo apt-get install php5-curl               //安装,此处的名字对应上面显示的

 

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

登录页面(login.html)

Swoole支持Thinkphp5以及短信验证码

 

send.php

Swoole支持Thinkphp5以及短信验证码

 

安装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机制发送短信防止卡住让用户等待

 

相关标签: PHP Swoole