php實現消息推送
① 如何在php後端及時推送消息給客戶端
<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 初始化一個worker容器,監聽1234埠
$worker = new Worker('websocket://0.0.0.0:1234');
// 這里進程數必須設置為1
$worker->count = 1;
// worker進程啟動後建立一個內部通訊埠
$worker->onWorkerStart = function($worker)
{
// 開啟一個內部埠,方便內部系消灶褲統推送數據,Text協議格式 文本+換行符
$inner_text_worker = new Worker('Text://拿簡0.0.0.0:5678');
$inner_text_worker->onMessage = function($connection, $buffer)
{
global $worker;
// $data數組格式,裡面有uid,表示向那個uid的頁面推送數據
$data = json_decode($buffer, true);
$uid = $data['uid'];
// 通過workerman,向uid的頁面推送數據
$ret = sendMessageByUid($uid, $buffer);
// 返回推送結果
$connection->send($ret ? 'ok' : 'fail');
};
$inner_text_worker->listen();
};
// 新增加一個屬性,用來保存uid到connection的映射
$worker->uidConnections = array();
// 當有客戶端發來消息時執行的回調函數
$worker->onMessage = function($connection, $data)use($worker)
{
// 判斷當前客戶端是否已經驗證,既是否辯賀設置了uid
if(!isset($connection->uid))
{
// 沒驗證的話把第一個包當做uid(這里為了方便演示,沒做真正的驗證)
$connection->uid = $data;
/* 保存uid到connection的映射,這樣可以方便的通過uid查找connection,
* 實現針對特定uid推送數據
*/
$worker->uidConnections[$connection->uid] = $connection;
return;
}
};
// 當有客戶端連接斷開時
$worker->onClose = function($connection)use($worker)
{
global $worker;
if(isset($connection->uid))
{
// 連接斷開時刪除映射
unset($worker->uidConnections[$connection->uid]);
}
};
// 向所有驗證的用戶推送數據
function broadcast($message)
{
global $worker;
foreach($worker->uidConnections as $connection)
{
$connection->send($message);
}
}
// 針對uid推送數據
function sendMessageByUid($uid, $message)
{
global $worker;
if(isset($worker->uidConnections[$uid]))
{
$connection = $worker->uidConnections[$uid];
$connection->send($message);
return true;
}
return false;
}
// 運行所有的worker(其實當前只定義了一個)
Worker::runAll();
啟動後端服務
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連接到內部推送埠
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);
// 推送的數據,包含uid欄位,表示是給這個uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 發送數據,注意5678埠是Text協議的埠,Text協議需要在數據末尾加上換行符
fwrite($client, json_encode($data)."\n");
// 讀取推送結果
echo fread($client, 8192);
這里的uid不一定是用戶的id,也可以理解為任務id即 taskid
以上代碼親測可以直接使用
② php 使用釘釘機器人推送消息
群機器人是釘釘群的高級擴展功能。群機器人可以將第三方服務的信息聚合到群聊中,實現自動化的信息同步。目前,大部分機器人在添加後局掘,還需要進行Webhook配置,才可正常使用(配置說明詳見操作流程中的幫助鏈接)。
例如:
通過聚合GitHub,GitLab等源碼管理服務,實現源碼更新同步。
通過聚合Trello,JIRA等項目協調服務,實現項目信息同步。
另外,群機器人支持Webhook協議的自定義接入,支持更多可能性,例如:你可將運維報警通過自定義機器人聚合到釘釘群實現提醒功能。
消息發送太頻繁會嚴重影響群成員的使用體驗,大量發消息的場景(譬如系統監控報警)可以將這些信息進行整合,通過markdown消息以摘要的形式發送到群里。
每個機器人每分鍾最多桐此核發送20條。如果超過20條,會限流10分鍾。
登錄釘釘PC客戶端(請升級至最新版),操作入口:
窗口右上角點擊【頭像】,進入」機器人管理「, 可對所有機器人進行統一管理。
進入一個釘釘群,在群的頂部功能欄中,點擊【群設置】,進入菜單可以看到【群機器人】的入口,點擊進入「群機器人」的管理面板後,可以進行添加、編輯和刪除群機器人的操作。
我們這里使用最後一個webhook
步驟一,在機器人管理頁面選扒汪擇「自定義」機器人,輸入機器人名字並選擇要發送消息的群。如果需要的話,可以為機器人設置一個頭像。點擊「完成添加」,完成後會生成Hook地址,如下圖:
步驟二,點擊「復制」按鈕,即可獲得這個機器人對應的Webhook地址,其格式如下:
(1)獲取到Webhook地址後,用戶可以向這個地址發起HTTP POST 請求,即可實現給該釘釘群發送消息。注意,發起POST請求時,必須將字元集編碼設置成UTF-8。
(2)當前自定義機器人支持文本 (text)、鏈接 (link)、markdown(markdown)、ActionCard、FeedCard消息類型,大家可以根據自己的使用場景選擇合適的消息類型,達到最好的展示樣式。
(3)自定義機器人發送消息時,可以通過手機號碼指定「被@人列表」。在「被@人列表」裡面的人員收到該消息時,會有@消息提醒(免打擾會話仍然通知提醒,首屏出現「有人@你」)。
(4)當前機器人尚不支持應答機制 (該機制指的是群里成員在聊天@機器人的時候,釘釘回調指定的服務地址,即Outgoing機器人)。
③ php 怎麼使用websocket推送消息
首先:WebSocket 不是一門技術,而是一種全新的協議。它應用 TCP 的 Socket(套接字),為網路應用定義了一個新的重要的能力:客戶端和伺服器端的雙全工傳輸和雙向通信。是繼 Java applets、 XMLHttpRequest、 Adobe Flash,、ActiveXObject、 各類 Comet 技術之後,伺服器推送客戶端消息的新趨勢。
其次:與http的關系
在網路分層上,websocket 與 http 協議都是應用層的協議,它們都是基於 tcp 傳輸層的,但是 websocket 在建立連接時,是借用 http 的 101 switch protocol 來達到協議轉換(Upgrade)的,從 HTTP 協議切換成 WebSocket 通信協議,這個動作協議中稱「握手」;
握手成功後,websocket 就使用自己的協議規定的方式進行通訊,跟 http 就沒有關系了。
用戶在socket檢測用戶上下線的是時候 可以http請求到自己的api層下面我貼一下我的代碼
這個地方明確表明了監聽埠,websocket跟api在同一個伺服器上面,所以用了0.0.0.0,所以你在http服務端如果想發消息給客戶端,只需要發送到這個埠上面,socket自動會監聽到發送給客戶端。
④ php如何編寫一個微信公眾平台的消息推送
給你個代碼樣例不可以直接復制使用
/**
*發送模板消息
*@param$tmpId模板ID
*@param$openId用戶openID
*@param$param模板參數
*@param$url
*@returnmixed
*@authorfjlhuman
*/
publicfunctionsendTmpMessage($tmpId,$openId,$param,$url){
$postUrl="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$this->accessToken;
$arrData['touser']=$openId;
$arrData['template_id']=$tmpId;//'6OT8DDNF-CbiadTsbEKKSCZVHe_9hnhxOBT7EvURNcE';
$arrData['url']=$url;
$arrData['data']=$param;
$json=json_encode($arrData);
$result=Curl::post($postUrl,$json);
$result=json_decode($result,true);
$rData['isTure']=false;
$rData['msg']="";
if($result['errcode']==0){
$rData['isTure']=true;
$rData['msg']="發送成功";
}else{
$rData['msg']=$result['errcode'];
}
return$rData;
}
詳情請參考微信公眾平台技術文檔->模板消息介面
⑤ php 微信模板消息 5000人的推送
1、php+redis 消息隊列
2、swoole非同步執行
想玩並發的話,php 的話除了 pcntl_fork 多個進程跑腳本,本身有批處理的模塊,可以用 curl_multi_* 批量發送
⑥ php 定時推送消息怎麼做
這個要用到伺服器系統的計劃任務,如果是linux伺服器 的cron。代碼實現是非常消耗性能的,需要不停的循環執行。
⑦ 如何在php中用百度雲推送進行消息的推送
在php中用網路雲推送進行消息的推送的方法
1.Android端推送
// 創建Android SDK對象.
$asdk = new \Vendor\pushsdk\PushSDK(); //自己引入網路雲推送的SDK,官網上有文檔詳細介紹
$channelId = $channelrows;
$message = array (
// 消息的標題.
'title' => $title,
// 消息內容
'description' => $brief,
//傳廣告id,可以通過鍵值對的形式傳多個值
'custom_content'=>array('id'=>$id),
);
// 設置消息類型為通知類型.
$opts = array (
'msg_type' => 1,
);
// 向目標設備發送一條消息(群發,指的是通過前面的篩選之後的channelId進行的大量的推送)
$rs = $asdk -> pushBatchUniMsg($channelId, $message, $opts);
// 判斷返回值,當發送失敗時, $rs的結果為false, 可以通過getError來獲得錯誤信息.
if($rs === false)
{
print_r($asdk->getLastErrorCode());
print_r($asdk->getLastErrorMsg());
}
else{echo "success!";}
2.IOS推送
// 創建Ios SDK對象.
$isdk = new \Vendor\ipushsdk\IPushSDK();
$channelId = $channelrows;
$message = array (
'aps' => array(
'alert' => $brief, // 消息內容
),
'id' =>$id, //賬號ID,這邊能夠以鍵值對的形式可以傳多個值
);
// 設置消息類型為 通知類型.
$opts = array (
msg_type' => 1,
'deploy_status' => 2, //2是生產狀態,剛開始開發測試時需要設置成1進行測試
);
$rs = $isdk->createTag('tag_new'); //通過創建標簽的方式來實現群發的功能
if($rs !== false)
{
if($isdk -> addDevicesToTag('tag_new',$channelId) !== false)
{
// 發送
$rs = $isdk -> pushMsgToTag('tag_new',$message,$opts);
//刪除標簽
$delRs = $isdk->deleteTag('tag_new');
//判斷返回值,當發送失敗時, $rs的結果為false, 可以通過getError來獲得錯誤信息.
if($rs === false)
{
print_r($isdk->getLastErrorCode());
print_r($isdk->getLastErrorMsg());
}
else{echo "success!";}
}
}
⑧ php實現websocket實時消息推送
一、socket協議的簡介
WebSocket是什麼,有什麼優點
WebSocket是一個持久化的協議,這是相對於http非持久化來說的。應用層協議
舉個簡單的例子,http1.0的生命周期是以request作為界定的,也就是一個request,一個response,對於http來說,本次client與server的會話到此結束;而在http1.1中,稍微有所改進,即添加了keep-alive,也就是在一個http連接中可以進行多個request請求和多個response接受操作。然而在實時通信中,並沒有多大的作用,http只能由client發起請求,server才能返回信息,即server不能主動向client推送信息,無法滿足實時通信的要求。而WebSocket可以進行持久化連接,即client只需進行一次握手,成功後即可持續進行數據通信,值得關注的是WebSocket實現client與server之間全雙工通信,即server端有數據更新時可以主動推送給client端。
二、介紹client與server之間的socket連接原理
1、下面是一個演示client和server之間建立WebSocket連接時握手部分
2、client與server建立socket時握手的會話內容,即request與response
a、client建立WebSocket時向伺服器端請求的信息
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket //告訴伺服器現在發送的是WebSocket協議
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一個Base64 encode的值,這個是瀏覽器隨機生成的,用於驗證伺服器端返回數據是否是WebSocket助理
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
b、伺服器獲取到client請求的信息後,根據WebSocket協議對數據進行處理並返回,其中要對Sec-WebSocket-Key進行加密等操作
HTTP/1.1 101 Switching Protocols
Upgrade: websocket //依然是固定的,告訴客戶端即將升級的是Websocket協議,而不是mozillasocket,lurnarsocket或者shitsocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //這個則是經過伺服器確認,並且加密過後的 Sec-WebSocket-Key,也就是client要求建立WebSocket驗證的憑證
Sec-WebSocket-Protocol: chat
3、socket建立連接原理圖:
三、PHP中建立websocket的過程講解
SocketService.php:
web.html: