【发布时间】:2019-07-16 13:35:27
【问题描述】:
相关信息:issue 3602 on GitHub
我正在做一个收集和测试公共/免费代理的项目,并注意到当我使用 curl_multi 接口测试这些代理时,有时会收到很多 28(timeout) 错误。如果我单独测试每个代理,这种情况永远不会发生。
问题在于这个问题的重现性不可靠,而且它不会总是出现,它可能是 curl 中的东西或其他东西。
不幸的是,我不是那么深的网络调试器,我不知道如何在更深层次上调试这个问题,但是我写了 2 个 C 测试程序(其中一个最初是 written by Daniel Stenberg 但我修改了它输出为与其他 C 程序相同的格式)。这 2 个 C 程序使用 curl 测试 407 个公共代理
-
带有 curl_multi 接口(有问题)
-
在许多线程上使用 curl,每个 curl 都在一个线程上运行。 (没问题)
These are the 2 C programs I wrote for testing我不是 C 开发人员,所以请告诉我您在这 2 个程序中发现的任何错误。
这是我一个月前用来重现问题的original PHP class。
还有these are the 2 C programs tests results。您可以注意到使用 curl_multi 超时完成的测试,而 curl-threads 进行的超时是稳定的(大约 407 个代理中的 50 个正在工作)。
这是来自测试结果的样本。 请注意第 4 列和第 5 列,了解 curl 线程如何超时约 170 次并成功连接约 40 次。其中,curl_multi 在 407 个代理中实现了 0 次成功连接和约 300 次超时。
column(1) : #
column(2) : time(UTC)
column(3) : total execution time (seconds)
column(4) : no error 0 (how many requests result in no error CURLE_OK)
column(5) : error 28 (how many requests result in error 28 CURLE_OPERATION_TIMEDOUT)
column(6) : error 7 (how many requests result in error 7 CURLE_COULDNT_CONNECT)
column(7) : error 35 (how many requests result in error 35 CURLE_SSL_CONNECT_ERROR)
column(8) : error 56 (how many requests result in error 56 CURLE_RECV_ERROR)
column(9) : other errors (how many requests result in errors other than the above)
column(10) : program that used the curl
column(11) : cURL version
c(1) c(2) c(3)c(4)c(5)c(6)c(7)c(8)c(9) c(10) c(11)
267 2019-3-28 01:58:01 40 43 176 183 1 4 0 C (curl - threads) (Linux Fedora) 7.59.0
268 2019-3-28 01:59:01 30 0 286 110 1 10 0 C (curl-multi one thread) (Linux Fedora) 7.59.0
269 2019-3-28 02:00:01 30 46 169 181 1 8 2 C (curl - threads) (Linux Fedora) 7.59.0
270 2019-3-28 02:01:01 31 0 331 74 1 1 0 C (curl-multi one thread) (Linux Fedora) 7.59.0
271 2019-3-28 02:02:01 30 42 173 186 1 4 1 C (curl - threads) (Linux Fedora) 7.59.0
272 2019-3-28 02:03:01 30 0 277 116 1 13 0 C (curl-multi one thread) (Linux Fedora) 7.59.0
为什么 curl_multi 超时与大多数连接不一致,而 curl-threads 从不这样做?
我下载了 Wireshark 并在 2 个 C 程序运行时用它来捕获流量,我还 filtered 到 2 个 C 程序使用的代理列表的流量,并将 files 保存在 GitHub 上。
curl-threads 程序(预期行为)
407 个代理中有 63 个成功连接和 158 个连接超时。
- 这是程序output。
- 这是Wireshark .pcapng raw file。
curl_multi 程序(un预期的行为)
407 个代理中有 0 个成功连接和 272 个连接超时。
- 这是程序output。
- 这是Wireshark .pcapng raw file。
您可以使用 Wireshark 打开 .pcapng 文件并查看我的计算机上记录的流量,同时出现预期/意外行为。我过滤了到 407 代理 IP 的流量,并在 30 秒的 curl 限制后让 Wireshark 打开了一会儿,因为我注意到一些数据包仍然出现。我不了解 Wireshark 和这种级别的网络,但我认为这可能很有用。
带宽注意事项:
在wireshark中打开curl_threads程序的.pcapng文件(正常行为),然后转到Statistics > Conversations。你会看到这样的窗口
我已经将数据复制并保存在Github上here,现在计算从A->B和B->A发送的字节的Sum。
正常工作所需的整个带宽约为 692.8 KB。
【问题讨论】:
-
请查看我对 GitHub 问题的评论。此外,在您的代码中,最好启用
CURLOPT_VERBOSE。为了保持一致性,使用 badger 在 GitHub 上提供的 C 版本也可能相当重要。 -
你好@JL2210 我有replied 对你在 GitHub 上的评论。关于 C 版本,我只是添加了聚合测试结果并将它们打印到与线程程序格式相同的文件的功能,因此我可以将两个程序的结果放在同一个文件中并进行比较。
-
我想我已经进行了编辑,使您的问题和您的情况更加清晰。请查看并回复我。
-
@JL2210 非常感谢您的编辑,我会检查它们。 “你的网络上是否有防火墙?或者可能限制出站连接的东西” 如果我的网络有问题,那么 curl-threads 程序也会有,但线程程序可以正常工作curl-multi 程序有时会重现该问题。
-
@JL2210 同样,我制作了一个小 C 程序,它使用
curl在 1 个线程上进行 1 个请求,它工作正常。curl_multi仍然产生28超时错误,我不再使用了。
标签: php c curl bug-tracking curl-multi