請教PHP+Redis實作任務佇列的思路

WBOY
發布: 2016-10-19 10:40:50
原創
1844 人瀏覽過

我的PHP網站程式呼叫了一個外部網站的介面。
當用戶輸入數據,PHP程式會接收數據,然後根據數據請求那個外部網站的接口,獲得數據返回給用戶。
但是當多個使用者同時提交資料時,PHP會同時請求那個接口,那個接口就會回傳錯誤。

我現在是想用PHP+Redis做個佇列,使用者的請求會被放在Redis佇列中,逐一去外部介面查詢,避免同時請求介面的問題。

具體要怎麼實現呢?

回覆內容:

我的PHP網站程式呼叫了一個外部網站的介面。
當用戶輸入數據,PHP程式會接收數據,然後根據數據請求那個外部網站的接口,獲得數據返回給用戶。
但是當多個使用者同時提交資料時,PHP會同時請求那個接口,那個接口就會回傳錯誤。

我現在是想用PHP+Redis做個佇列,使用者的請求會被放在Redis佇列中,逐一去外部介面查詢,避免同時請求介面的問題。

具體要怎麼實現呢?

試試這個

<code>// 创建请求ID标志, uniqid 无法保证唯一, 自己去搜索生成唯一的方法
$uuid = uniqid();
$tsk_name = "mytask";
$time_out = 30000; // 超时策略: 30秒
$time_start = time();
$redis->rPush($tsk_name, $uuid); // 右(后)插入队列

// 堵塞等待队列中第一个和$uuid匹配的(到我了)
while($uuid != $redis->lGet($tsk_name, 0)){
    if((time()-$time_start)> $time_out) {
        break; // 超时跳出(某些原因队列异常了, 可能永远取不到)
    }
    usleep(10); // sleep 10ms, 再次尝试
}

// 这里执行任务的处理代码....

// $response 已拼装好要返回的内容
// 处理完成后(数据库等已入库更新), 需要:
if($redis->lGet($tsk_name, 0) == $uuid){ // 再次确认第一个是本请求
    $redis->lPop($tsk_name); // 完成任务了, 从队列中移除
}
 
// 响应内容
return $response;</code>
登入後複製

手打未驗證, 思路是這樣.

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!