app直播原始碼如何實現直播間紅包功能

雲豹科技阿星發表於2021-09-07

紅包功能是app直播原始碼直播間中的重要功能,紅包功能的實現,可以幫助主播快速提高直播間氛圍,讓使用者對直播產生興趣,app直播原始碼可以怎樣實現紅包功能呢?

軟體簡介

yaf專案快速開發(相容php7):

yaf project rapid development, integration of the db action class support chain operation, support separate read and write, pdo, mysqli, mongo, upload operation, adding redis operations and weixin sharing, will then join weixin pay 整合了db操作類支援鏈式操作,支援讀寫分離,pdo,mysqli,mongo,upload操作, 加入redis操作以及微信分享,加入微信支付,加入swoole的支援, 已支援swoole_http_server,swoole_websocket_server,高併發搶購、秒殺,陣列演算法處理等,新增了後臺admin模組,整合表格樹!新增基於swoole的資料庫連線池,支援自定義載入目錄類檔案和函式檔案(透過外掛的形式實現的) 在/application/controllers/Index.php裡新增了yac、yaconf的使用,透過yac實現高併發計數器,加入swoole實現簡單的影片直播,加入了網頁控制檯的實現例如:

swoole實現簡單的影片直播(可以實時傳音訊、影片、聊天)

需要php以cli模式執行/server/swoole/SwooleLiveServer.php
錄製影片頁面 
接受影片頁面 

composer 安裝

{ "require": { "yaffastdemo/yaf": "dev-master" } }

資料庫連線池使用方法

服務檔案在/server/mysql/DbServer.php
簡單地封裝檔案在/application/library/mysql/dbclient.php
配置在conf/application.ini中
;資料庫連線池配置
DbServer.async=true   //配置是同步執行還是非同步執行,預設不配置代表非同步執行,同步執行設定為false
DbServer.multiprocess=false //配置是否啟用多程式,預設不配置代表單程式阻塞模式,多程式模式要設定為true
DbServer.pool_num=20  //配置連線池mysql的數量
DbServer.port=9501
DbServer.logfile="/server/log/DbServer.log"
DbServer.localip="192.168.2.13"
使用方法:
$dbclient=new mysql_dbclient;
    //print_r($data);
    for ($i=0; $i <100 ; $i++) { 
        $dbclient->query("INSERT INTO user(name) VALUES('$i')");
        //echo "INSERT INTO user(name) VALUES('$i')";
    }
    $data=$dbclient->query("select * from user");
    $dbclient->close();
    print_r($data);
    exit;

資料庫連線池多程式執行如下:

後臺訪問:

新增了紅包生成演算法(拼手氣紅包和普通紅包):

需要安裝php擴充套件zqf
$obj=new zqf();
第一個引數是紅包總額,第二個人參數紅包數量,第三個引數預設代表拼手氣紅包,設定為1的話為普通紅包
拼手氣紅包
$hongb= $obj->hongbao(10,8);或者$hongb= $obj->hongbao(10,8,0);返回陣列為Array ( [0] => 1.33 [1] => 1.02 [2] => 1.28 [3] => 0.44 [4] => 1.37 [5] => 0.81 [6] => 1.81 [7] => 1.94 )
普通紅包,每個人數額一樣設定第三個引數
$hongb= $obj->hongbao(10,8,1);返回陣列為Array ( [0] => 1.25 [1] => 1.25 [2] => 1.25 [3] => 1.25 [4] => 1.25 [5] => 1.25 [6] => 1.25 [7] => 1.25 )
var_dump($hongb);

新增了全域性變數適用於高併發搶購、秒殺,陣列演算法處理等

需要安裝php擴充套件zqf
首先安裝php擴充套件zqf.so
phpize來安裝
然後在php檔案呼叫
dl('zqf.so');或者phpini里載入
$obj=new zqf();
$counter= $obj->autoadd(0,1,0);(宣告只針對多執行緒)
echo $counter;

新增了分頁類

$Page = new Page($count,$pageoffset);
$show = $Page->show();

新增了swoole的task伺服器,並實現拆包處理任務演算法

$task=new swoole_taskclient();
//拆分資料演算法
$count_num_pre=$data['prenum'];
$count_num=$data['appendnum'];
$count_size=10000;//拆分資料演算法
if($count_num>$count_size){
    $z_str=floor($count_num/$count_size);
    $y_str=fmod($count_num,$count_size);
    $data['explodenum']=$y_str==0?$z_str:$z_str+1;
    for ($i=1; $i <$z_str+1 ; $i++) { 
        $data['appendnum']=$count_size;
        $data['explodecount']=$i;
        $task->connect(json_encode($data));
        $data['prenum'] +=$count_size;
    }
if($y_str){
$data['appendnum']=$y_str;
$data['explodecount']=$z_str+1;
$task->connect(json_encode($data));
}}else{
$task->connect(json_encode($data));
}

新增了驗證碼類

$config =    array(
'fontSize'    =>    30,    // 驗證碼字型大小
'length'      =>    4,     // 驗證碼位數
'useNoise'    =>    true, // 關閉驗證碼雜點
);
$Verify = new Verify($config);
$Verify->entry();

新增了生成二維碼功能

需要安裝php擴充套件zqf
$obj=new zqf();
$obj->savefile('昌平香堂','./test.png',500);第一個引數是url,第二引數是儲存路徑,第三個引數是二維碼長或者寬

生成透明二維碼

$obj=new zqf();
$obj->savefile('昌平香堂','./test.png',500,1);第一個引數是url,第二引數是儲存路徑,第三個引數是二維碼長或者寬,第四個引數是決定是否透明,預設是不透明的


自定義自動載入配置如下:

;可以任意載入多個目錄類和目錄函式用,隔開
例如:application.autolibrary='job,common';application.autofunction='pro,function'
支援深度查詢目錄,如果不想開啟可以不用配置
application.autolibrary='common'
application.autofunction='function'
;如果不想開啟可以不用配置

db操作類讀寫分離配置如下:

;資料庫驅動型別
database.config.type='mysql'
;伺服器地址
database.config.host='192.168.0.1,192.168.0.2'
;資料庫名
database.config.name='root'
;使用者名稱
database.config.user='user1,user2'
;密碼
database.config.pwd='pwd1,pwd2'
;埠
database.config.port= '3306'
;啟用欄位快取
database.config.fields_cache=false
;資料庫編碼預設採用utf8
database.config.charset='utf8'
;資料庫部署方式:0 集中式(單一伺服器),1 分散式(主從伺服器)
database.config.deploy_type=1
;資料庫讀寫是否分離 主從式有效
database.config.rw_separate=true
;讀寫分離後 主伺服器數量
database.config.master_num=1
;指定從伺服器序號
database.config.slave_no=''

db操作類使用方法如下:

$where=array('id' =>37936);
  $user=new HbModel('hb_users');//直接例項化給表名就行了,其他跟操作thinkphp一樣
  $result=$user->where($where)->select();//支援鏈式操作,支援pdo,mysqli,mongo
  echo $user->getlastsql();
  print_r($result);
  exit;

redis操作使用方法如下:

$this->_redis=new phpredis();//需要安裝redis擴充套件
      $this->_redis->set('token',1);

upload操作使用方法如下:

$config=Yaf_Application::app()->getConfig()->upload->config->toArray();
        $ftpconfig=Yaf_Application::app()->getConfig()->ftp->config->toArray();
        $upload=new Upload($config, 'Ftp',$ftpconfig); 
        $info=$upload->upload();
        if (!$info) {// 上傳錯誤提示錯誤資訊
            echo $upload->getError();
        } else {// 上傳成功
            if (!empty($info["UpLoadFile"]))
                $pic=array("cate_pic" => $info["UpLoadFile"]['savepath'] . $info["UpLoadFile"]['savename']);
            print_r($pic);
        }

微信分享操作使用方法如下:

//微信分享
    $jssdk=new wx_share_wxshare("你的appId", "你的appSecret");
    $signPackage=$jssdk->GetSignPackage();;
    $data['appId']=$signPackage['appId'];
    $data['nonceStr']=$signPackage['nonceStr'];
    $data['timestamp']=$signPackage['timestamp'];
    $data['signature']=$signPackage['signature'];
    $this->getView()->assign("token", json_encode($data));

微信支付操作使用方法如下:(具體操作在weixin控制器裡)

$jsApi = new wx_pay_JsApi();
    $oid=123;//訂單id
    $userid=456;//使用者id
    $wx_openid='';//微信授權id
    if(empty($wx_openid)){
        if (!isset($_GET['code'])) {
            $url = wx_pay_config::JS_API_CALL_URL;
            $url = str_replace('%oid%', $oid, $url);
            $url = str_replace('%uid%', $userid, $url);
            $url = $jsApi->createOauthUrlForCode($url);
            Header("Location: $url");
            } else {
            $code = $_GET['code'];
            $jsApi->setCode($code);
            $openid = $jsApi->getOpenId();
            }            
        }else{
            $openid = $wx_openid;
        }
        $unifiedOrder = new wx_pay_UnifiedOrder();
        $unifiedOrder->setParameter("body", "test"); //商品描述
        $unifiedOrder->setParameter("out_trade_no", "1111111111"); //商戶訂單號 
        $unifiedOrder->setParameter("total_fee", "0101"); //總金額 $total
        $unifiedOrder->setParameter("notify_url", wx_pay_config::NOTIFY_URL); //通知地址 
        $unifiedOrder->setParameter("trade_type", "JSAPI"); //交易型別
        $unifiedOrder->setParameter("openid", $openid); //使用者標識
        $prepay_id = $unifiedOrder->getPrepayId();
        $jsApi->setPrepayId($prepay_id);
        $jsApiParameters = $jsApi->getParameters();

swoole作為http_server操作使用方法如下:

根目錄下有server整合了swoole服務端 (後臺執行直接php執行)
    HttpServer.php (linux環境下直接執行php HttpServer.php)
    http_server實現原理是把swoole作為底層處理請求,然後透過php-cli把url交給
    yaf來處理,yaf只是作為一個框架使用

swoole作為http_server的呼叫如下:

在瀏覽器裡輸入生產環境可以把監聽埠改為80
    public function swoolehttpAction(){
             Yaf_Dispatcher::getInstance()->autoRender(FALSE);
            $where=array('id' =>37936);
            $user=new HbModel('hb_users');//直接例項化給表名就行了,其他跟操作thinkphp一樣
            $result = $user->where($where)->select();
            //echo $user->getlastsql();
            // echo json_encode( $result);
            echo json_encode( $where);//透過swoole返回給瀏覽器結果{"id":37936}
        }

swoole作為websocket_server操作使用方法如下:

根目錄下有server整合了swoole服務端 (後臺執行直接php執行)
    WebSocketServer.php (linux環境下直接執行php WebSocketServer.php)
    websocket_server實現原理是把swoole作為websocket伺服器,然後透過php-cli把引數傳給
    yaf來處理,yaf來處理邏輯

swoole作為websocket_server的呼叫如下:

在瀏覽器裡輸入
    public function swoolesocketAction(){
            Yaf_Dispatcher::getInstance()->autoRender(FALSE);
            $this->getView()->display("index/swoolesocket.html");
        }

html請求websocket

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="/public/js/jquery-1.8.0.min.js"></script>
<style>
 #chatLog {width:440px; height:200px; border:1px solid #7F9DB9; overflow:auto;margin-bottom: 20px}
</style>
<meta charset="UTF-8">
<script type="text/javascript">
var exampleSocket = new WebSocket("ws://192.168.1.46:9503");//設為相應的監聽ip及埠號
 exampleSocket.onopen = function (event) {
 exampleSocket.send("親!我連上啦!"); 
};
exampleSocket.onmessage = function (event) {
    console.log(event.data);
 $('#chatLog').append('<br/>'+event.data);
}
exampleSocket.onclose = function(event) { 
 console.log('Client notified socket has closed',event); 
}; 
</script>
</head>
<body>
<div id="chatLog" ></div>
<input  type="text" id="content">
<button  onclick="exampleSocket.send( document.getElementById('content').value )">傳送</button>
<button  onclick="exampleSocket.send('smes_closed')">關閉</button>
</body>
</html>

宣告:本文由雲豹科技轉發自qieangel部落格,如有侵權請聯絡作者刪除


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982461/viewspace-2790861/,如需轉載,請註明出處,否則將追究法律責任。

相關文章