redis php 守护进程,PHP守护进程利用Redis队列实现业务
PHP可以用 GO也可以用這個不限制
隊列使用場景,大量用戶信息推送,大量祝福短信發送等
核心技術點 Redis的lpush brpop
lpush 負責向key中寫入數據
brpop 阻塞模式獲取key中的值從而實現業務
模擬實例。向用戶發送短信
PHP版代碼2.0
生成者
/**
* Created by PhpStorm.
* User: smallForest<1032817724@qq.com>
* Date: 2019-12-02
* Time: 11:11
*/
ini_set('default_socket_timeout', -1); //不超時
// 聲明對象
$redis = new \Redis();
// 連接Redis
$r = $redis->connect('127.0.0.1', 6379);
// 選擇Redis DB
$redis->select(4);
// 聲明SMS隊列的key
$key = 'SMS_QUEUE';
//寫入數據
for ($i = 0; $i < 10; $i++) {
// 獲取隨機手機號 // 有的時候不同用戶文本內容不一樣 最好可以分開設置。注意key名可以根據情況更改
$json = json_encode(["mobile"=>randomPhoneNumber(),"msg"=>"【滴滴答】尊敬的用戶您好!祝您新年快樂!"]);
// 左入隊列
$redis->lPush($key, $json);
echo 'yes:' . $i . PHP_EOL;
}
function randomPhoneNumber()
{
// 手機號頭
$header = ["133", "149", "153", "173", "177",
"180", "181", "189", "199", "130", "131", "132",
"145", "155", "156", "166", "171", "175", "176",
"185", "186", "166", "134", "135", "136", "137",
"138", "139", "147", "150", "151", "152", "157",
"158", "159", "172", "178", "182", "183", "184",
"187", "188", "198", "170", "171"];
$count = count($header);
$header_value = rand(0, $count - 1);
return $header[$header_value] . '****' . rand(1000, 9999);
}
消費者
/**
* Created by PhpStorm.
* User: smallForest<1032817724@qq.com>
* Date: 2019-12-02
* Time: 10:58
*/
ini_set('default_socket_timeout', -1); //不超時
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->select(4);//切換到db4
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
While ($key_arr = $redis->brpop('SMS_QUEUE', 0)) {
try{
// key_arr 是一個數組 0 表示key名稱 SMS_QUEUE ,1 表示獲取到的值
usleep(100000);
$json = $key_arr[1];
//解析json
$json_arr = json_decode($json,true);
if(is_array($json_arr) && count($json_arr)==2){
if(!sms($json_arr["mobile"], $json_arr["msg"])){
throw new Exception("發送失敗");
}
}else{
throw new Exception("解析失敗");
}
}catch (Exception $e){
// 左入隊列
$redis->lPush("SMS_QUEUE", $json);
}
}
// 發送短信函數
function sms($mobile, $msg)
{
echo '用戶手機號:' . $mobile . ',信息:' . $msg . ' 發送成功!' . PHP_EOL;
return true;
}
PHP版代碼1.0
生產者
/**
* Created by PhpStorm.
* User: smallForest<1032817724@qq.com>
* Date: 2019-12-02
* Time: 11:11
*/
ini_set('default_socket_timeout', -1); //不超時
// 聲明對象
$redis = new \Redis();
// 連接Redis
$r = $redis->connect('127.0.0.1', 6379);
// 選擇Redis DB
$redis->select(4);
// 聲明SMS隊列的key
$key = 'SMS_QUEUE';
//寫入數據
for ($i = 0; $i < 10; $i++) {
// 獲取隨機手機號
$m = randomPhoneNumber();
// 左入隊列
$redis->lPush($key, $m);
// 有的時候不同用戶文本內容不一樣 最好可以分開設置。注意key名可以根據情況更改
$redis->set($m, '【滴滴答】尊敬的用戶您好!祝您新年快樂!');
echo 'yes:' . $i . PHP_EOL;
}
function randomPhoneNumber()
{
// 手機號頭
$header = ["133", "149", "153", "173", "177",
"180", "181", "189", "199", "130", "131", "132",
"145", "155", "156", "166", "171", "175", "176",
"185", "186", "166", "134", "135", "136", "137",
"138", "139", "147", "150", "151", "152", "157",
"158", "159", "172", "178", "182", "183", "184",
"187", "188", "198", "170", "171"];
$count = count($header);
$header_value = rand(0, $count - 1);
return $header[$header_value] . '****' . rand(1000, 9999);
}
消費者
/**
* Created by PhpStorm.
* User: smallForest<1032817724@qq.com>
* Date: 2019-12-02
* Time: 10:58
*/
ini_set('default_socket_timeout', -1); //不超時
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->select(4);//切換到db3
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
While ($key_arr = $redis->brpop('SMS_QUEUE', 0)) {
// key_arr 是一個數組 0 表示key名稱 SMS_QUEUE ,1 表示獲取到的值
usleep(100000);
$key = $key_arr[1];
if ($msg = $redis->get($key)) {
sms($key, $msg);
$redis->del(key());
}
}
// 發送短信函數
function sms($mobile, $msg)
{
echo '用戶手機號:' . $mobile . ',信息:' . $msg . ' 發送成功!' . PHP_EOL;
}
守護進程可以用nohup創建,給消費者創建守護進程
?疑問-如果lpush很多手機號該怎么辦呢?
swoole多線程
總結
以上是生活随笔為你收集整理的redis php 守护进程,PHP守护进程利用Redis队列实现业务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php垂直居中代码_div标签:水平居中
- 下一篇: 厦航女飞行员招飞标准是什么?