我有website1和website2,每个网站都有自己的网络服务器,每个都使用Apache MPM和PHP,最新版本。
来自website1的访问者向website1发送POST请求,然后website1通过cURL与website2通信,并将一些数据传递给它,然后等待响应。
Website1代码示例:
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,'https://www.website.com?request='.$enc_data);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT_MS ,30000);
curl_setopt($ch,CURLOPT_TIMEOUT_MS, 30000); //timeout in seconds
$result = curl_exec($ch);
//log the result to database
curl_close($ch);
网站2做了一些大约需要1秒才能执行的操作。所以每次响应时间都超过1秒。有时甚至是2-3秒。
website2的示例代码(用于模拟目的)
sleep(mt_rand(1,3));
echo 'Request solved';
问题是,如果100个请求通过上面的代码从website1向website2发出,它们将逐个(先进先出)执行,而不是并行执行。这意味着在第30个请求之后,一切都会超时。
问题是,这些请求是在恒定的基础上完成的,它们的数量可能会增加,我需要website2能够以某种方式并行处理它们。我不能接受连续的超时。服务器可以升级以拥有更多资源,这不是问题所在。
就像在任何动态服务器上一样,如果100个人从他们的浏览器向website1发送一个请求(通过点击按钮或刷新网站),那么该请求将由website1单独处理,当有人从website1访问任何页面时,不会给其他99个人增加延迟,因为我假设Apache将每个请求分配给一个线程/工作者。
我希望website2处理来自website1的请求也是一样的,基本上是将每个请求作为不同的“请求者”处理,并并行处理。
我假设这可能是一个apache设置,或者我需要添加到cURL请求的头中的一些东西,这样website2就会认为请求来自不同的IP/访问者或类似的东西。
有人能指导我如何实现我需要的东西吗?
发布于 2020-06-13 16:59:35
关于问题的:
的问题是,如果100个请求通过上面的代码从website1向website2发出,它们将逐个(先进先出)执行,而不是并行执行。这意味着在第30个请求之后,一切都会超时。
如果在server2上运行apache,那么为什么website2要逐个执行,而不是并行执行呢?cURL access website2的方式与浏览器相同。
请求一个接一个地执行肯定不是真的。
Apache:
Apache提供了一个标准配置,此配置不包含如此小的限制。但是,您可以增加设置:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
更多关于这方面的信息--也许这对你有帮助:https://serverfault.com/questions/775855/how-to-configure-apache-workers-for-maximum-concurrency
在您的位置上,我也会关闭Apache2配置中的Keepalive,以避免浪费连接:
KeepAlive Off
cURL:
我甚至会使用CURL_OPT_HTTPHEADER在curl站点上关闭keepalive:
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
'Connection: Close'
));
并禁止cURL使用-i重用连接,这也有助于避免阻塞:
curl_setopt($curlHandle, CURLOPT_FORBID_REUSE, TRUE);
另一种设置是,当cURL无法解析ipv4并重试解析IPv6 (未配置或错误)时,避免(有时会发生)长时间等待。
curl_setopt($curlHandle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
还有许多其他选项可以调整您的速度。将数据从一台服务器发送到另一台服务器通常不是一个很好的解决方案,它会延长脚本的执行时间,这是绝对正常的。但是你收到超时是不正常的。按照上面写的那样调整你的设置,它应该会解决它--问题更多的是在Server2 Apache配置上,而不是在cURL端。
https://stackoverflow.com/questions/62356744
复制相似问题