日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

redis php 守护进程,PHP守护进程利用Redis队列实现业务

發布時間:2025/4/5 php 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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队列实现业务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。