如何使用cURL执行多个同时请求?

45

我想使用cURL来测试服务器的洪水处理。目前我在Windows命令行中使用以下命令:

curl www.example.com

现在我要做的与之前相同,都是获取页面,但我希望一次生成至少10个请求而不是一个请求,应该如何实现?


3
curl www.example.com#[0-10] 可能会接近。 - tamberg
7个回答

40

虽然curl是非常有用和灵活的工具,但它并不适合这种类型的使用。有其他可用的工具,可以让您对同一URL进行多个并发请求。

ab 是这种类型的一个非常简单而有效的工具,适用于任何Web服务器(尽管介绍侧重于Apache服务器)。

Grinder 是一种更复杂的工具,可以让你指定许多不同的URL在负载测试中使用。这使您可以混合请求廉价和昂贵的页面,这可能更接近您网站的标准负载。


4
谢谢,这很有帮助。最终,我创建了一个批处理脚本来执行我需要的curl,然后再创建另一个批处理脚本来多次执行该批处理脚本,使用start cmd /c curl.bat多次运行。 - Daniel T.

24

7.68.0版本开始,curl可以并行获取多个URL。这个例子将使用3个并行连接从urls.txt文件中获取URL:

curl --parallel --parallel-immediate --parallel-max 3 --config urls.txt

urls.txt:

url = "example1.com"
url = "example2.com"
url = "example3.com"
url = "example4.com"
url = "example5.com"

4
对于想要检查POST方法的并发连接的人,以下示例可以使用:curl --parallel --parallel-immediate --parallel-max 8 -X POST -d "mama=mia" --config urls.txt - S. Francis
有没有一种方法可以在并行请求中为同一个URL提供不同的主体? - Urvah Shabbir

7
Curl本身可能无法完成此操作,但是bash可以实现。
curl -o 1.txt -X GET https://foo & curl -o 2.txt -X GET https://foo

4
这不会使请求并发,这相当于在循环中运行curl。 - Jonathan
2
是的,它们是并发的:& 连接符将第一个命令放在“后台”,并立即启动第二个命令。但是这种方法不太适用于洪水测试。 - alexis
我尝试过了,它不是并发的。正如@Jonathan所提到的那样,这更像是一个循环。 - Desolator

4

另一种方法是使用Curl和GNU Parallel。

以下是一个简化的示例,总共进行100次Curl请求,每次同时进行10个(并发):

seq 100 | parallel --max-args 0 --jobs 10 "curl https://www.example.com"

seq 100 生成一个数字列表,我们将其管道传递给parallel

1
2
3
4
5
6
7
8
9
10
... and so on

然后我们使用--max-args 0选项,这意味着它将每个参数执行1个作业。请勿更改此数字。等效别名选项为-n

文档说:

-n 0 表示读取一个参数,但在命令行中插入 0 个参数。

然后我们使用--jobs 10选项,它将并发/同时运行最多 10 个作业。等效别名选项为-j--procs/-P

文档说:

每台机器上的作业槽数。并行运行多达 N 个作业。0 表示尽可能多。默认值为 100%,它将在每台机器上的每个 CPU 核心上运行一个作业。

下面是一个更实用的示例,它打印返回代码,隐藏输出,并根据命令成功(&&)或失败(||)打印一个 SUCCESS 或 FAIL 消息,我认为这对我的调试很有用:

seq 100 | parallel --max-args 0 --jobs 10 "curl -w '%{http_code}\n' https://www.example.com --output /dev/null --location --silent && printf SUCCESS\n\n || printf FAIL\n\n"

example output of using GNU Parallel to Curl


这种方法会更慢,因为它无法重用连接。 - tejasvi88
这篇关于本地curl并行请求的答案似乎应该被接受 > https://dev59.com/Imkw5IYBdhLWcg3w1d4m#66998509 - Elijah Lynn

0
for ((i=1;i<=10;i++)); do curl  -I -k "https://www.example.com"; done

这是适用于我的脚本。如果您需要添加更多请求,请更改10的值。


0

从版本7.66.0开始,您可以使用-Z, --parallel执行以下操作:

curl -Z https://example.com -o file1 https://example.com -o file2

这似乎是这个答案的重复,https://dev59.com/Imkw5IYBdhLWcg3w1d4m#66998509。 - Elijah Lynn

0

我曾经遇到过类似的情况,最终我写了一个Python脚本:

import threading
import requests

def thread_function(url):
    response = requests.get(url)

thread1 = threading.Thread(target=thread_function, args=('http://foo',))
thread2 = threading.Thread(target=thread_function, args=('http://bar',))

thread1.start()
thread2.start()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接