????????隨著微信時代的到來不恭,有時商家會利用微信公眾號會給用戶發(fā)送模板消息,但是粉絲太多折晦,同事發(fā)送服務(wù)器會受不了沾瓦,又不能保證每個用戶都能接收到,腫么辦暴拄。编饺。乖篷。
????????大神們別著忙透且,逗號來給您支招豁鲤。
①先寫上php
ini_set('display_errors', 'On');
error_reporting(30719);
ignore_user_abort();
set_time_limit(0);
//define('IN_MOBILE', true);
require '../../../../framework/bootstrap.inc.php';
require_once IA_ROOT . '/addons/match_making/core/common/defines.php';
require_once PATH_CORE . 'common/autoload.php';
Func_loader::core('global');
global $_W, $_GPC;
//return;
$sets = pdo_fetchall('select distinct uniacid from ' . tablename(PDO_NAME . 'setting'));
foreach ($sets as $set) {
$_W['uniacid'] = $set['uniacid'];
if (empty($_W['uniacid']) || $_W['uniacid'] == -1) {
continue;
}
//查詢沒有推送完畢的消息琳骡,因?yàn)橥扑筒粫茴l繁每次只查詢一個即可
$time = TIMESTAMP - 86400; //目前只選擇推送剛剛發(fā)布的消息
$sql = "SELECT * FROM " . tablename(PDO_NAME . 'message')
. " WHERE uniacid = '{$_W['uniacid']}'"
. " AND `status` = 1 AND `ispush` =1 AND (`ispushed` = 0 OR `ispushed` = 1) "
. " AND `updatetime` > $time "
. " ORDER BY id desc";
$message = pdo_fetch($sql);
//存在沒有推送或正在推送的消息
if (!empty($message)) {
//沒有推送過的消息
if ($message['ispushed'] == 0) {
//標(biāo)記為正在推送
$result = pdo_update(PDO_NAME . 'message', array('ispushed' => 1), array('id' => $message['id'], 'ispushed' => 0));
//如果標(biāo)記成功讼溺,將所有用戶的信息插入到臨時表,等待推送
if ($result) {
//所有用戶的openid
$sql = "SELECT openid FROM " . tablename(PDO_NAME . 'member')
. " WHERE uniacid = '{$_W['uniacid']}'"
. " AND `follow` = 1 ";
//? ? ? ? ? ? ? ? ? ? . " AND `istest` =1 ";
$openids = pdo_fetchall($sql);
if (!empty($openids)) {
$insert = "INSERT INTO " . tablename(PDO_NAME . 'message_push') . " (`uniacid`, `mid`, `openid`) VALUES ";
foreach ($openids as $openid) {
$insert .= "({$_W['uniacid']}, {$message['id']}, '{$openid[openid]}'),";
}
$insert = rtrim($insert, ',');
$insert .= ';';
pdo_query($insert);
}
}
}
/**
* 給用戶推送消息流程 防止并發(fā)重復(fù)發(fā)送
* 1. 每一個進(jìn)程(每次請求時)生成唯一一個 updateid
* 2. 將updateid賦予等待推送的用戶
* 3. 選擇賦予updateid成功的用戶炫狱,進(jìn)行推送(推送完畢后刪除記錄视译,防止push表日益變大)
* 4. 如果沒有等待推送的用戶,說明已經(jīng)推送完畢酷含,標(biāo)記消息為推送完成
*/
$updateid = random(10, true);
$limit = 10;
$sql = "UPDATE " . tablename(PDO_NAME . 'message_push') . " SET updateid = $updateid "
. " WHERE mid = :mid? AND updateid = 0 limit $limit ";
$result = pdo_query($sql, array(':mid' => $message['id']));
if ($result) {
$sql = "SELECT id,openid FROM " . tablename(PDO_NAME . 'message_push') . " WHERE updateid = $updateid limit $limit";
$pushlist = pdo_fetchall($sql, array(), 'id');
foreach ($pushlist as $push) {
//? ? ? ? ? ? ? ? usleep(250000);
//? ? ? ? ? ? ? ? $input['time'] = date('Y-m-d H:i:s', time());
//? ? ? ? ? ? ? ? $input['openid'] = $push['openid'];
Message::todo($push['openid'], $message);
Util::wl_log('message_send', PATH_DATA . 'task/', $input);
}
//刪除已經(jīng)發(fā)送完畢的記錄
$ids = array_keys($pushlist);
$ids_str = implode(',', $ids);
$sql = "DELETE FROM " . tablename(PDO_NAME . 'message_push') . " WHERE id IN($ids_str)";
pdo_query($sql);
} else {
//標(biāo)記為推送完成
pdo_update(PDO_NAME . 'message', array('ispushed' => 2), array('id' => $message['id']));
}
}
}
②然后在后臺或者用戶端寫上js椅亚,來執(zhí)行這個程序
if(typeof(jQuery)=='undefined'){
}else{
setInterval(function () {
$.ajax({
url: "{php echo mobile_url('common/runTask')}",
cache: false
})
}, 10000);
}
這樣就ok了B剿!慌闭!