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

如何使用cURL同时执行多个请求?,curl,request,Curl,Request,我想使用cURL在我的服务器上测试洪水处理。现在,我正在Windows命令行上使用此命令: curl www.example.com 这将获得一次页面。我现在想做同样的事情,除了不是一个请求,而是一次至少生成10个请求。我该怎么做呢?虽然curl是一个非常有用且灵活的工具,但它不适合这种类型的使用。还有其他工具可以让您对同一URL发出多个并发请求 是一个非常简单但有效的这类工具,适用于任何web服务器(尽管介绍的重点是Apache服务器) 是一个更复杂的工具,它可以让您指定在负载测试中使用的许

我想使用cURL在我的服务器上测试洪水处理。现在,我正在Windows命令行上使用此命令:

curl www.example.com

这将
获得一次页面。我现在想做同样的事情,除了不是一个请求,而是一次至少生成10个请求。我该怎么做呢?

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

是一个非常简单但有效的这类工具,适用于任何web服务器(尽管介绍的重点是Apache服务器)


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

Curl本身可能无法做到这一点,但bash可以做到

curl -o 1.txt -X GET https://foo & curl -o 2.txt -X GET https://foo

我也遇到过类似的情况,最后我写了一个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()

7.68.0开始,curl可以并行获取多个URL。此示例将从具有3个并行连接的
urls.txt
文件中获取URL:

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

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

另一种方法是使用GNU与Curl并行

下面是一个简化的示例,总共执行100个curl请求,每次10个(并发):

seq 100
生成一个数字列表,我们将其导入并行
中:

1
2
3
4
5
6
7
8
9
10
... and so on
然后我们使用
--max args 0
选项,这意味着它将为每个参数执行1个作业。不要改变这个号码。相同的别名选项为
-n

医生说:

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

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

医生说:

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

下面是一个功能性更强的示例,它打印返回代码,隐藏输出,并根据命令是否成功(
&&
)打印一条成功或失败消息,我发现这对调试非常有用:

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"

谢谢,这很有帮助。最后,我创建了一个批处理脚本来执行我需要的curl,然后使用
start cmd/c curl.bat
multiples.curl www.example.com#[0-10]创建了另一个批处理脚本来多次执行该批处理脚本。这不会使请求并发,这相当于在循环中运行curl。是的,它们是并发的:
&
连接器将第一个命令放在“后台”,并立即启动第二个命令。不过,它不能很好地扩展到洪水测试。
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"