我的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>
手打未驗證, 思路是這樣.