如题,自己本想写个在网页里实现向aria2提交下载任务的功能,使用到php的curl扩展来向aria2的rpc服务提交下载任务,发现在aria2没有开启的情况下,会出出现curl长时间等待的情况,就会出现整个worker进程被curl阻塞,无法响应其他正常请求,即使设置了curl的超时时间为毫秒级也没有用(curl_setopt($ch, CURLOPT_TIMEOUT_MS,$outtime);),大概会阻塞5秒
起初还以为是其他请求代码造成了超时,所以先把其他业务代码删除了,直接在onmessage里new aria2对象来实验
curl执行curl_exec耗时记录,超时毫秒数设置由post方法的参数传入,执行前记录到t0,执行后记录到t1,然后输出差值
我的post方法超时设置为200毫秒
这是官方网站上下载的静态php版本执行的情况,可以看到启动命令是./php,版本是8.3.12,截图里输出yy5.00995,就是阻塞耗时5秒,而上面post方法传入的超时为200毫秒
这是用我系统的php执行情况,可以看到启动命令是php,版本是8.2.6。截图里输出yy0.0071709,阻塞就没有那么严重
这里写具体的系统环境相关信息
ubuntu
PHP的curl要设置毫秒超时的话,需要设置
curl_setopt ( $ch, CURLOPT_NOSIGNAL, true);
没想到老大回复这么快,加了还是没用,估计就是php静态编译时有什么地方不对
设置2秒试下
还是不行,还是要阻塞5秒,把阻塞时间设置为8000毫米,还是阻塞5秒
https://www.workerman.net/q/11441
看下这个帖子
解决了,原来是今天修改了aria2类,修改时无意中导致aria2类中的aria2RPC地址出错了,刚开始按照你给出的帖子(https://www.workerman.net/q/11441)修改了系统配置,也有1秒的阻塞,显然这个耗时也不行。最后无奈又把备份的代码拿来试,结果老代码没有问题了,就仔细从头检查了一下今天修改过的aria2类,一下就发现了是RPC地址出错了。不过仍然让我困惑的就是,同样一份代码(指aria2RPC地址配置出错),静态PHP与系统内安装的php就会有区别,从上图可以看到系统内安装的php版本,似乎并没有受aria2RPC地址配置出错的影响,依然可以做到毫秒级响应。而静态PHP就会受影响。
所以使用静态版本php做curl请求时,一定要仔细检查请求地址,否则可能会导致整个进程被长时间阻塞
aria2的RPC地址没有问题的情况下请求耗时都是在10毫秒左右,哎,因为粗心,导致浪费一大把时间