本篇文章是给新手学习php redis队列怎么玩的。我们模拟验证码发送,通过队列完成。
(1).创建一个验证码发送接口
/** * 发送验证码 */ public function sendCaptcha() { //外部参数(获取手机号) $mobile = $_REQUEST['mobile'] ?? 0; if (!$mobile) { exit(json_encode(['code' => -1, 'msg' => '手机号码不得为空'], 256)); } //生成短信验证码(随机数4位) $captcha = rand(1111, 9999); //组装队列数据Json $send_data = [ 'mobile' => $mobile, 'captcha' => $captcha, ]; //连接本地的Redis 服务 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); //向Redis的send_captcha队列投递数据 $isPush = $redis->lPush('send_captcha', json_encode($send_data)); if (!$isPush) { exit(json_encode(['code' => -1, 'msg' => '验证码发送失败'], 256)); } //输出发送成功 exit(json_encode(['code' => 0, 'msg' => '验证码发送成功'], 256)); }
(2).创建一个命令行队列处理脚本console.php
<?php //连接本地的Redis 服务 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); //循环从Redis的send_captcha队列提取数据 while (true) { //从队列提取数据,超时时间5秒 //$content正常返回第一个元素是队列名称,第二个元素是你保存的值 $content = $redis->brPop('send_captcha', 5); if ($content) { //提取数据中的手机号和验证码 $data = json_decode($content['1'], true); $mobile = $data['mobile']; $captcha = $data['captcha']; //进行发送,此处为伪代码 //sendCode($mobile,$captcha); //输出日志 echo "向{$mobile}发送验证码{$captcha}成功" . PHP_EOL; } }
(3).模拟请求验证码接口
curl http://xxxx.com/sendCaptcha //输出 {"code":0,"msg":"验证码发送成功"}
(4).启动命令行脚本php console.php,脚本输出如下
向13380793145发送验证码6188成功
解析:通过向接口提交手机号,接口会把要发送的手机号和验证码保存到队列,而另外1个命令行脚本会监听队列并及时发送验证码。假如同时来100人同时发送验证码也不担心会阻塞导致网络带宽资源耗尽。
本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...
先在centos安装openssl,然后开始://生成私钥openssl genrsa -out rsa_private_key.pem 1024//生成公钥openssl rsa -in rsa_private_key.pem&...
array_merge是最常用的数组合并方法,+号同样也可以,但是却有很大不同。array_merge遇到相同字符串key,后面数组的key会覆盖前面数组的key,+号正好相反。$a = [ 'one' => 'A on...
(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习: (2.1)pcntl_fork()执行时: &nbs...
<?php /** * daemonize让当前脚本为守护进程执行 * @param string $callback 匿名函数 */ function daemonize($callback) {...
第一次听说端口复用是在mixphp最新版本中发现的,mixphp启动监听9501端口,现在作者说可以多开几个进程来执行mixphp,我心里想了下再启动不是会端口冲突嘛,但是却没有问题,于是下载mixphp的源码解读,原来是启动http服务器使用new Co\Http\Server('0.0....