Thinkphp-queue中exceeded the timeout of 60 seconds的问题

方滴云WEB2022-06-22 18:32

最近在调试百度网盘API接口,遇到了大文件下载,首先想到的肯定是做分片下载了,刚好网盘的API对这个的支持也是非常好的,一切进行的都还算顺利。

在做分片下载时,我们使用了消息列队,因为使用的thinkphp6.0,所以就近我们选择了thinkphp-queue,整个下载任务是非常流畅的,也没有遇到啥特殊的问题。

当然有一个问题,不得不提一下,就是按官方要求使用dlink拼接accessToken下载时,一直返回302,当然官方文档有提及到这个,但是本人对curl的一些操作不是非常熟悉,所以忽略了一个参数的配置。

就是这个CURLOPT_FOLLOWLOCATION,它的作用是是否跟踪重定向,当设备CURLOPT_FOLLOWLOCATION 为TRUE时,是会跟踪重定向的。这样302的错误就可以解决了。

下面加到正题,看我们的exceeded the timeout of 60 seconds的问题。先把问题重现下,就是找个大一点的文件下载,因为我分片是1M,所以60M以上基本都可以了的。

我这里第一个视频有62M多了,刚好满足够测试条件。当然,这个是测试,正确的做法,多个下载发布多个任务吧。

于是,网上各种求助啊,比如调整php.ini里的max_input_time=60之类的,不要为我为什么,主要是它和60有关,我们就调整试下。调后重启队列,甚至重启web服务器,然而都是无效的。

最后,没有办法,我们就从源从去找吧,找到Symfony\Component\Process\Exception\ProcessTimedOutException,通过它我们定位到了Symfony\Component\Process里的__construct方法。

在queue的think\queue\Listener中我们发现了它的身影,在其listen()方法中我们看到了这个定义,然后就手动直接改了,试过之后,发现问题依然。

之后,我们在think\queue\command/Listen中,找到了如下的一个定义。

但是从这个方面的定义来看,我们并没有入口可以传值,除非在发布任务时,传入这个超时时间。addOptio()定义如下。

所以,我就手动在think\queue\command/Listen的configure()方法中,手动将这个timeout改了,然后,这个世界终于安静了。