내 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>
손타자 검증은 안됐는데 아이디어는 이렇습니다.