我的php网站程序调用了一个外部网站的接口。
当用户输入数据,php程序会接收数据,然后根据数据请求那个外部网站的接口,获得数据返回给用户。
但是当多个用户同时提交数据时,php会同时请求那个接口,那个接口就会返回错误。
我现在是想用PHP+Redis做个队列,用户的请求会被放在Redis队列中,逐一去外部接口查询,避免同时请求接口的问题。
立即学习“PHP免费学习笔记(深入)”;
具体要怎么实现呢?
我的php网站程序调用了一个外部网站的接口。
当用户输入数据,php程序会接收数据,然后根据数据请求那个外部网站的接口,获得数据返回给用户。
但是当多个用户同时提交数据时,php会同时请求那个接口,那个接口就会返回错误。
我现在是想用PHP+Redis做个队列,用户的请求会被放在Redis队列中,逐一去外部接口查询,避免同时请求接口的问题。
立即学习“PHP免费学习笔记(深入)”;
具体要怎么实现呢?
试试这个
<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怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号