>백엔드 개발 >PHP 튜토리얼 >PHP+Redis로 작업 대기열을 구현하는 방법에 대한 아이디어를 제공해 주세요.

PHP+Redis로 작업 대기열을 구현하는 방법에 대한 아이디어를 제공해 주세요.

WBOY
WBOY원래의
2016-10-19 10:40:501914검색

내 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>

손타자 검증은 안됐는데 아이디어는 이렇습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.