這個(gè)要用到服務(wù)器系統(tǒng)的計(jì)劃任務(wù),如果是linux服務(wù)器 的cron。代碼實(shí)現(xiàn)是非常消耗性能的,需要不停的循環(huán)執(zhí)行。
成都創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來(lái)公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過(guò)去的十多年時(shí)間我們累計(jì)服務(wù)了上千家以及全國(guó)政企客戶,如雨棚定制等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過(guò)硬的技術(shù)實(shí)力獲得客戶的一致贊賞。
你寫個(gè)PHP文件,把要發(fā)送的學(xué)生的信息給讀取出來(lái),調(diào)用發(fā)短信的接口,在liunx下執(zhí)行定時(shí)任務(wù)就可以了,一個(gè)小時(shí)發(fā)送一次,這樣應(yīng)該就可以完成了
后端代碼
push.php
?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 初始化一個(gè)worker容器,監(jiān)聽(tīng)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)
{
// 開(kāi)啟一個(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'];
// 通過(guò)workerman,向uid的頁(yè)面推送數(shù)據(jù)
$ret = sendMessageByUid($uid, $buffer);
// 返回推送結(jié)果
$connection-send($ret ? 'ok' : 'fail');
};
$inner_text_worker-listen();
};
// 新增加一個(gè)屬性,用來(lái)保存uid到connection的映射
$worker-uidConnections = array();
// 當(dāng)有客戶端發(fā)來(lái)消息時(shí)執(zhí)行的回調(diào)函數(shù)
$worker-onMessage = function($connection, $data)use($worker)
{
// 判斷當(dāng)前客戶端是否已經(jīng)驗(yàn)證,既是否設(shè)置了uid
if(!isset($connection-uid))
{
// 沒(méi)驗(yàn)證的話把第一個(gè)包當(dāng)做uid(這里為了方便演示,沒(méi)做真正的驗(yàn)證)
$connection-uid = $data;
/* 保存uid到connection的映射,這樣可以方便的通過(guò)uid查找connection,
* 實(shí)現(xiàn)針對(duì)特定uid推送數(shù)據(jù)
*/
$worker-uidConnections[$connection-uid] = $connection;
return;
}
};
// 當(dāng)有客戶端連接斷開(kāi)時(shí)
$worker-onClose = function($connection)use($worker)
{
global $worker;
if(isset($connection-uid))
{
// 連接斷開(kāi)時(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
你說(shuō)的應(yīng)該是服務(wù)端主動(dòng)向客戶端推送消息, 這個(gè)只能使用Socket建立長(zhǎng)連接來(lái)實(shí)現(xiàn)。
客戶端實(shí)現(xiàn)比較簡(jiǎn)單, 大多數(shù)瀏覽器提供的應(yīng)該都有接口, 幾個(gè)方法就可以建立一個(gè)連接,然后進(jìn)行消息監(jiān)聽(tīng)就可以了,服務(wù)端實(shí)現(xiàn)稍微復(fù)雜點(diǎn), 不過(guò)你根本不用自己寫那些底層代碼, php平臺(tái)上有一個(gè)庫(kù)叫 "Workerman", 里面所有功能已經(jīng)幫你實(shí)現(xiàn)好了, 你看看文檔就能直接調(diào)用了, 很簡(jiǎn)單的。
第一,PHP不可以定時(shí)發(fā)布文章,第二,你必須設(shè)置定時(shí)器
基于以上兩個(gè)問(wèn)題,如果是linux 可以用crontab,如果是window可以用定時(shí)服務(wù),具體怎么樣可以百度,
然后再寫一個(gè)PHP腳本,在定時(shí)器上添加這個(gè)腳本,這個(gè)腳本要能讀取數(shù)據(jù)庫(kù)。