在workerman里面调用curl。长时间运行(大概十几天)curl变慢。超时、但是目标服务器访问正常。响应都是毫秒级的。重启workerman后正常。请问下是什么原因导致的。如何解决呢
关于curl发起的http请求超时有两个要注意: 1、连接超时 2、数据超时 这两个超时都要设置合理的超时时间,否则可能会由于外部接口不稳定造成长时间阻塞并较长时间占用资源描述符,最终导致占用大量系统资源而无法得到及时释放,所以这会经常引起运行速度缓慢或者不可预知的错误。
所以从这个地方试着排查下,另外当缓慢的时候,不要重启workerman,运行: php start.php status 看看状态报告,一般也会有很多有价值的参考数据。
我设置了超时时间为三秒。基本上每个请求基本上都在三秒。有的超出的就自动断掉了。重启后请求都是毫秒级的。不知道是什么原因。workerman运行时间一长。curl请求时间就会变长。重启就好了。status 命令没有任何异常,所有进程都是正常的
就是curl请求时间变长了。这种状况像是目标服务器响应很慢的感觉。但是我看了下目标服务器响应是很快的。
已经数据验证过肯定是curl本身这个地方请求或响应时间变慢了吗? 另外有没有在调用curl之前的其他上下文的地方存在阻塞代码呢?
@614:没有可能阻塞代码。确定是curl请求的响应时间变慢了。因为我发送curl这里是单独的进程。
搞个简单的脚本,试下是不是curl的问题。
<?php while(1) { $time_start = microtime(true); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); file_put_contents('/tmp/curl.log', (microtime(true)-$time_start)."\n", FILE_APPEND); sleep(1); }
关于curl发起的http请求超时有两个要注意:
1、连接超时
2、数据超时
这两个超时都要设置合理的超时时间,否则可能会由于外部接口不稳定造成长时间阻塞并较长时间占用资源描述符,最终导致占用大量系统资源而无法得到及时释放,所以这会经常引起运行速度缓慢或者不可预知的错误。
所以从这个地方试着排查下,另外当缓慢的时候,不要重启workerman,运行: php start.php status 看看状态报告,一般也会有很多有价值的参考数据。
我设置了超时时间为三秒。基本上每个请求基本上都在三秒。有的超出的就自动断掉了。重启后请求都是毫秒级的。不知道是什么原因。workerman运行时间一长。curl请求时间就会变长。重启就好了。status 命令没有任何异常,所有进程都是正常的
就是curl请求时间变长了。这种状况像是目标服务器响应很慢的感觉。但是我看了下目标服务器响应是很快的。
已经数据验证过肯定是curl本身这个地方请求或响应时间变慢了吗? 另外有没有在调用curl之前的其他上下文的地方存在阻塞代码呢?
@614:没有可能阻塞代码。确定是curl请求的响应时间变慢了。因为我发送curl这里是单独的进程。
搞个简单的脚本,试下是不是curl的问题。