如何处理超时api请求

话说,我接了百度的千川4.0,因为需求不是对话型的,所以用不了流式,只能等着千川给我返回,但是这个千川的返回时间长达(60s+),经常超时,问了百度的技术,对方让我改成3.5的接口,或者增加超时等待时间

我用了队列,php 和 nginx 都设置了150秒的超时

但是,还是会偶尔提示:
App\Jobs\BaiDuQianChuanJob has been attempted too many times or run too long. The job may have previously timed out

有没有什么别的更好的方法?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 26

如果用guzzle的话需要用 options 里面的 timeout 来设置超时时间

1个月前 评论
wongvio (楼主) 1个月前

不能回调处理吗?

1个月前 评论
wongvio (楼主) 1个月前
Smilephp (作者) 1个月前
wongvio (楼主) 1个月前
Smilephp (作者) 1个月前
因为需求不是对话型的,所以用不了流式,只能等着千川给我返回

所以需求的场景是什么?

感觉貌似只能延长超时时间?

1个月前 评论
wongvio (楼主) 1个月前

file 暂时只能想到加大超时时间

1个月前 评论

Laravel 队列,Linux 下,监听超时的 sign 信号和 curl 是同一个,也就是两者超时时间要设置成一样

1个月前 评论

需求不是对话型的,不代表你不能使用流式。你完全可以建立一个链接,在这个链接只使用一次,等对方全发过来后,你就终止就是了

1个月前 评论
wongvio (楼主) 1个月前

这也太慢了,生成几千字的文章也不至于

1个月前 评论
_jue

这一不小心网站不被卡死了

1个月前 评论
cxxxx

是否可以采用异步的方式进行呢,比如先返回一个默认结果给前端,之后的话将请求存入redis队列 再通过多进程方式去消费请求百度API接口,超时则进行尝试,成功之后将结果通知给用户。

1个月前 评论
wongvio (楼主) 1个月前

这种情况只能用流式了,http下你设置多少都会有超时的情况,他们这个模型不是很稳定,哪怕你设置的150s也会超时的情况。只能用sse去接收,可以接收时不断覆盖结果,然后加个状态字段提示下生成中,有多少结果就展示多少结果,或者直接等流式结束完全覆盖结果

1个月前 评论
yalng (作者) 1个月前
wongvio (楼主) 1个月前

流式接收千川的响应,接收完了更新你的答案就可以了,不会超时的

1个月前 评论

laravel队列可以把超时设置大一点,要不就自己写个简单的队列处理, ···php while(true){ // todo redis()->lpop() ...... } ···

1个月前 评论

单独用swoole或者workman、甚至是go之类的,写一个单独脚本来进行接收处理就好。脚本通过比如队列唤醒,或者redis发布订阅、kafka之类的。然后脚本来发起请求

1个月前 评论
seebyyu 1个月前
wdnmd (作者) 1个月前

自己写一个回调接口,在队列收到响应的适合自己请求这个接口

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!