bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

PHP電商訂單自動確認收貨redis隊列

一、場景

之前做的電商平臺,用戶在收到貨之后,大部分都不會主動的點擊確認收貨,導致給商家結款的時候,商家各種投訴,于是就根據需求,要做一個訂單在發貨之后的x天自動確認收貨。所謂的訂單自動確認收貨,就是在在特定的時間,執行一條update語句,改變訂單的狀態。

成都創新互聯從2013年創立,是專業互聯網技術服務公司,擁有項目成都網站設計、網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元翁源做網站,已為上家服務,為翁源各地企業和個人服務,聯系電話:13518219792

二、思路

最笨重的做法,通過linux后臺定時任務,查詢符合條件的訂單,然后update。最理想情況下,如果每分鐘都有需要update的訂單,這種方式也還行。奈何平臺太小,以及賣家發貨時間大部分也是密集的,不會分散在24小時的每分鐘。那么,定時任務的話,查詢過多,不適合。這里可以先把將要自動確認收貨的訂單信息存儲到其他介質上,比如redis,memcache,rabbitmq,然后執行的腳本從前面的介質獲取到訂單信息來判斷,這里可以大大的減少數據庫的查詢壓力。

redis隊列的生產者

對此,我們選擇每天在凌晨兩點的時候,通過linux的定時任務把即將要確認收貨的訂單信息查詢出來,然后存儲在redis上,redis上我們選擇的隊列,隊列處理的特點就是先進先出,前面的數據在查詢訂單時,通過發貨時間排序,所以最先出隊列的肯定是距離規定的自動收貨時間最近的訂單。代碼如下

$successCount=0;
$failCount=0;
$screen_time?=?3600*24*9;//設置篩選天數
$data?=?array();
$now_time?=?time();
//查詢符合要求的數據
$sql="select?id,send_time?as?deliver_time?from?`order`?where?is_send=1?and?is_del=0?and?is_cancel=0?and?is_token=0?and?send_time>0?and?send_time?+?{$screen_time}?<?$now_time?
order?by?send_time?asc";
$res?=?$con->query($sql);
//當隊列還有數據時將數據記錄并清除
while($redis->LLEN('auto_recevice_order')){
$txt?=?'執行時間:'.date('Y-m-d?H:i:s').',信息:'.$redis->RPOP('auto_recevice_order');
file_put_contents('./autoToken/fail_log.txt',$txt."\r\n".PHP_EOL,FILE_APPEND);
$failCount++;
}
//重新填充數據進隊列
while?($row?=?$res->fetch_assoc())?{
?$successCount++;
?$redis->LPUSH('auto_recevice_order',json_encode($row1));
}
?$con->close();?
?$success=date('Y-m-d?H:i:s').':[推送成功]:本次成功推送數據:'.$successCount.'條;記錄上次處理失敗數據:'.$failCount."條\r\n";
?file_put_contents('./success_log.txt',$success."\r\n".PHP_EOL,FILE_APPEND);

redis隊列的消費者

隊列的消費者沒有通過linux的定時任務去做,用linux的screen+php cli模式執行php腳本,消費者只需要不斷的從隊列中讀取訂單信息,然后判斷訂單信息中的發貨時間,如果達到自動收貨的要求,就執行update語句。同時如果沒有達到收貨的時間,而且與收貨時間間距比較大的時候,可以讓php腳本休眠sleep一定的時間數,這個時間數自己調節設計,獲取出來的未達到時間要求的訂單,需要重新推送到redis隊列中去,而且還是隊列的頂端。以便下次獲取。代碼如下:

$set_time?=?3600*24*10;//設置幾天后自動收貨
while(true){
if($i%30==0){
usleep(10);//防止while?循環使CPU使用率過高
}
if($redis->LLEN('auto_recevice_order')){
$data?=?json_decode($redis->RPOP('auto_recevice_order'));
$id?=?(int)$data->id;//將數據轉化為×××
$deliver_time?=?(int)$data->deliver_time;//將數據轉化為×××
$res1?=?$res2?=false;
$now_time?=?time();
if(($deliver_time+$set_time)<$now_time){
??$sql1?=?"update?`order`?set?`is_token`='1',`token_time`?=?$now_time?where?id=$id?and?is_send=1?and?is_del=0?and?is_cancel=0?and?is_token=0?and?send_time?+?{$set_time}?<?$now_time";
??$res1?=?$con->query($sql1);//更新數據
$rows?=?MySQLi_affected_rows($con);
if($rows){
?$ip?=?$this->getIp();
?$sql2?=?"insert?into?`order_log`(`order_id`,`log_msg`,`log_ip`,`log_role`,`log_user`,`log_order_state`,`log_time`)?VALUES($id,'系統自動收貨','$ip','系統','

這里執行php腳本,需要用到linux的screen或者supervisor、nohup守護進程。具體用法可自行百度.同樣腳本里面最好有必須的日志記錄。

三、思考

隨著業務的增長,在隊列中同一秒內,存在的多個需要處理的訂單,而一次只能從隊列中取出一個相關訂單信息的時候,可以采用一個生產者多個消費者的模式,這種情況下,可以用到鎖機制,保證一條消息只能到達一個消費者。當redis數據達到一定的量之后,也可以適當的調整生產者的執行頻率和對應的條件。

分享題目:PHP電商訂單自動確認收貨redis隊列
當前URL:http://vcdvsql.cn/article8/pcodip.html

成都網站建設公司_創新互聯,為您提供營銷型網站建設網站收錄商城網站面包屑導航服務器托管

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設公司