?php
成都創(chuàng)新互聯(lián)公司是少有的成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、營(yíng)銷型企業(yè)網(wǎng)站、微信小程序定制開發(fā)、手機(jī)APP,開發(fā)、制作、設(shè)計(jì)、友情鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,于2013年成立,堅(jiān)持透明化,價(jià)格低,無套路經(jīng)營(yíng)理念。讓網(wǎng)頁(yè)驚喜每一位訪客多年來深受用戶好評(píng)
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 初始化一個(gè)worker容器,監(jiān)聽1234端口
$worker = new Worker('websocket://0.0.0.0:1234');
// 這里進(jìn)程數(shù)必須設(shè)置為1
$worker-count = 1;
// worker進(jìn)程啟動(dòng)后建立一個(gè)內(nèi)部通訊端口
$worker-onWorkerStart = function($worker)
{
// 開啟一個(gè)內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
$inner_text_worker = new Worker('Text://0.0.0.0:5678');
$inner_text_worker-onMessage = function($connection, $buffer)
{
global $worker;
// $data數(shù)組格式,里面有uid,表示向那個(gè)uid的頁(yè)面推送數(shù)據(jù)
$data = json_decode($buffer, true);
$uid = $data['uid'];
// 通過workerman,向uid的頁(yè)面推送數(shù)據(jù)
$ret = sendMessageByUid($uid, $buffer);
// 返回推送結(jié)果
$connection-send($ret ? 'ok' : 'fail');
};
$inner_text_worker-listen();
};
// 新增加一個(gè)屬性,用來保存uid到connection的映射
$worker-uidConnections = array();
// 當(dāng)有客戶端發(fā)來消息時(shí)執(zhí)行的回調(diào)函數(shù)
$worker-onMessage = function($connection, $data)use($worker)
{
// 判斷當(dāng)前客戶端是否已經(jīng)驗(yàn)證,既是否設(shè)置了uid
if(!isset($connection-uid))
{
// 沒驗(yàn)證的話把第一個(gè)包當(dāng)做uid(這里為了方便演示,沒做真正的驗(yàn)證)
$connection-uid = $data;
/* 保存uid到connection的映射,這樣可以方便的通過uid查找connection,
* 實(shí)現(xiàn)針對(duì)特定uid推送數(shù)據(jù)
*/
$worker-uidConnections[$connection-uid] = $connection;
return;
}
};
// 當(dāng)有客戶端連接斷開時(shí)
$worker-onClose = function($connection)use($worker)
{
global $worker;
if(isset($connection-uid))
{
// 連接斷開時(shí)刪除映射
unset($worker-uidConnections[$connection-uid]);
}
};
// 向所有驗(yàn)證的用戶推送數(shù)據(jù)
function broadcast($message)
{
global $worker;
foreach($worker-uidConnections as $connection)
{
$connection-send($message);
}
}
// 針對(duì)uid推送數(shù)據(jù)
function sendMessageByUid($uid, $message)
{
global $worker;
if(isset($worker-uidConnections[$uid]))
{
$connection = $worker-uidConnections[$uid];
$connection-send($message);
return true;
}
return false;
}
// 運(yùn)行所有的worker(其實(shí)當(dāng)前只定義了一個(gè))
Worker::runAll();
啟動(dòng)后端服務(wù)
php push.php start -d
前端接收推送的js代碼
var ws = new WebSocket('ws://127.0.0.1:1234');
ws.onopen = function(){
var uid = 'uid1';
ws.send(uid);
};
ws.onmessage = function(e){
alert(e.data);
};
后端推送消息的代碼
// 建立socket連接到內(nèi)部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);
// 推送的數(shù)據(jù),包含uid字段,表示是給這個(gè)uid推送
$data = array('uid'='uid1', 'percent'='88%');
// 發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符
fwrite($client, json_encode($data)."\n");
// 讀取推送結(jié)果
echo fread($client, 8192);
這里的uid不一定是用戶的id,也可以理解為任務(wù)id即 taskid
以上代碼親測(cè)可以直接使用
?可以用第三方軟件極光推送來實(shí)現(xiàn)。對(duì)于定制化需求較強(qiáng)的,或者想擁有自己推送平臺(tái)的開發(fā)者,極光提供全功能的私有云方案。
極光推送快速開始步驟:
1、到極光推送官方網(wǎng)站注冊(cè)開發(fā)者帳號(hào);
2、登錄進(jìn)入管理控制臺(tái),創(chuàng)建應(yīng)用程序,得到 Appkey(SDK 與服務(wù)器端通過 Appkey 互相識(shí)別);
3、在推送設(shè)置中給 Android 設(shè)置包名、給 iOS 上傳證書、啟用 WinPhone,根據(jù)你的需求進(jìn)行選擇;
4、下載 SDK 集成到 App 里。
客戶端初始化 JPush 成功后,JPush 服務(wù)端會(huì)分配一個(gè) Registration ID,作為此設(shè)備的標(biāo)識(shí)(同一個(gè)手機(jī)不同 App 的 Registration ID 是不同的)。開發(fā)者可以通過指定具體的 Registration ID 來進(jìn)行對(duì)單一設(shè)備的推送。
一、socket協(xié)議的簡(jiǎn)介
WebSocket是什么,有什么優(yōu)點(diǎn)
WebSocket是一個(gè)持久化的協(xié)議,這是相對(duì)于http非持久化來說的。應(yīng)用層協(xié)議
舉個(gè)簡(jiǎn)單的例子,http1.0的生命周期是以request作為界定的,也就是一個(gè)request,一個(gè)response,對(duì)于http來說,本次client與server的會(huì)話到此結(jié)束;而在http1.1中,稍微有所改進(jìn),即添加了keep-alive,也就是在一個(gè)http連接中可以進(jìn)行多個(gè)request請(qǐng)求和多個(gè)response接受操作。然而在實(shí)時(shí)通信中,并沒有多大的作用,http只能由client發(fā)起請(qǐng)求,server才能返回信息,即server不能主動(dòng)向client推送信息,無法滿足實(shí)時(shí)通信的要求。而WebSocket可以進(jìn)行持久化連接,即client只需進(jìn)行一次握手,成功后即可持續(xù)進(jìn)行數(shù)據(jù)通信,值得關(guān)注的是WebSocket實(shí)現(xiàn)client與server之間全雙工通信,即server端有數(shù)據(jù)更新時(shí)可以主動(dòng)推送給client端。
二、介紹client與server之間的socket連接原理
1、下面是一個(gè)演示client和server之間建立WebSocket連接時(shí)握手部分
2、client與server建立socket時(shí)握手的會(huì)話內(nèi)容,即request與response
a、client建立WebSocket時(shí)向服務(wù)器端請(qǐng)求的信息
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket //告訴服務(wù)器現(xiàn)在發(fā)送的是WebSocket協(xié)議
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一個(gè)Base64 encode的值,這個(gè)是瀏覽器隨機(jī)生成的,用于驗(yàn)證服務(wù)器端返回?cái)?shù)據(jù)是否是WebSocket助理
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin:
b、服務(wù)器獲取到client請(qǐng)求的信息后,根據(jù)WebSocket協(xié)議對(duì)數(shù)據(jù)進(jìn)行處理并返回,其中要對(duì)Sec-WebSocket-Key進(jìn)行加密等操作
HTTP/1.1 101 Switching Protocols
Upgrade: websocket //依然是固定的,告訴客戶端即將升級(jí)的是Websocket協(xié)議,而不是mozillasocket,lurnarsocket或者shitsocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //這個(gè)則是經(jīng)過服務(wù)器確認(rèn),并且加密過后的 Sec-WebSocket-Key,也就是client要求建立WebSocket驗(yàn)證的憑證
Sec-WebSocket-Protocol: chat
3、socket建立連接原理圖:
三、PHP中建立websocket的過程講解
SocketService.php:
web.html:
在php中用百度云推送進(jìn)行消息的推送的方法
1.Android端推送
// 創(chuàng)建Android SDK對(duì)象.
$asdk = new \Vendor\pushsdk\PushSDK(); //自己引入百度云推送的SDK,官網(wǎng)上有文檔詳細(xì)介紹
$channelId = $channelrows;
$message = array (
// 消息的標(biāo)題.
'title' = $title,
// 消息內(nèi)容
'description' = $brief,
//傳廣告id,可以通過鍵值對(duì)的形式傳多個(gè)值
'custom_content'=array('id'=$id),
);
// 設(shè)置消息類型為通知類型.
$opts = array (
'msg_type' = 1,
);
// 向目標(biāo)設(shè)備發(fā)送一條消息(群發(fā),指的是通過前面的篩選之后的channelId進(jìn)行的大量的推送)
$rs = $asdk - pushBatchUniMsg($channelId, $message, $opts);
// 判斷返回值,當(dāng)發(fā)送失敗時(shí), $rs的結(jié)果為false, 可以通過getError來獲得錯(cuò)誤信息.
if($rs === false)
{
print_r($asdk-getLastErrorCode());
print_r($asdk-getLastErrorMsg());
}
else{echo "success!";}
2.IOS推送
// 創(chuàng)建Ios SDK對(duì)象.
$isdk = new \Vendor\ipushsdk\IPushSDK();
$channelId = $channelrows;
$message = array (
'aps' = array(
'alert' = $brief, // 消息內(nèi)容
),
'id' =$id, //賬號(hào)ID,這邊能夠以鍵值對(duì)的形式可以傳多個(gè)值
);
// 設(shè)置消息類型為 通知類型.
$opts = array (
msg_type' = 1,
'deploy_status' = 2, //2是生產(chǎn)狀態(tài),剛開始開發(fā)測(cè)試時(shí)需要設(shè)置成1進(jìn)行測(cè)試
);
$rs = $isdk-createTag('tag_new'); //通過創(chuàng)建標(biāo)簽的方式來實(shí)現(xiàn)群發(fā)的功能
if($rs !== false)
{
if($isdk - addDevicesToTag('tag_new',$channelId) !== false)
{
// 發(fā)送
$rs = $isdk - pushMsgToTag('tag_new',$message,$opts);
//刪除標(biāo)簽
$delRs = $isdk-deleteTag('tag_new');
//判斷返回值,當(dāng)發(fā)送失敗時(shí), $rs的結(jié)果為false, 可以通過getError來獲得錯(cuò)誤信息.
if($rs === false)
{
print_r($isdk-getLastErrorCode());
print_r($isdk-getLastErrorMsg());
}
else{echo "success!";}
}
}
當(dāng)前名稱:php怎么推送數(shù)據(jù),php實(shí)現(xiàn)消息推送
轉(zhuǎn)載源于:http://jinyejixie.com/article42/hsihec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、靜態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站、面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)