本篇文章是给新手学习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人同时发送验证码也不担心会阻塞导致网络带宽资源耗尽。
通常我们使用unset()删除数组的元素,数据的顺序并没有重置,使用array_merge()方法即可解决<?php $shoplist= array('a','b','c','d','e','...
原理:使用curl_init()创建多个请求实例,再使用curl_multi_init()批量执行创建的多个请求实例。文件1:curl.php<?php $threads=500;//并发请求次数 $url='http://blog.cn/index.php?';...
前面的文章对于高并发下单商品导致商品库存为负值的问题请先阅读再阅读本篇文章一定对您有帮助,建议亲手测试较好。加上文件锁后的下单处理代码:【一】.阻塞模式:(如果其他进程已经加锁文件,当前进程会一直等其他进程解锁文件后继续执行)<?php //连接数据库 $con=mysqli_connect(...
php arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。(1).创建一个学生类,并且实现arrayaccess 接口。<?php class studen...
面试中PHP面试官会问调用一个不存在的方法,如何知道是哪个文件哪行调用的?假设方法是getWorkLoad()回答1:开启PHP错误输出,PHP会输出Fatal error: Call to undefined function getWorkLoad() in D:\wwwroot\thinkpa...
<?php /** * daemonize让当前脚本为守护进程执行 * @param string $callback 匿名函数 */ function daemonize($callback) {...