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扩展
- 下载安装包(放在softpack)
- 解压并./configure --prefix=/usr/local/curl
- 直接用 phpize 会提示没有config.m4
- 进入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)
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机制发送短信防止卡住让用户等待
上一篇: Java 异常处理中对于 finally 的一些思考
下一篇: Java 中的位移运算符