我有网站1和网站2,每个网站都有自己的网络服务器,每个网站都使用Apache MPM和PHP,最新版本。
来自网站 1的访问者向网站 1 发送 POST 请求,然后网站 1 通过 cURL 与网站 2 通信,并将一些数据传递给它,然后等待响应。
网站 1 代码示例:
$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 秒。
网站示例代码2(用于模拟目的(
sleep(mt_rand(1,3));
echo 'Request solved';
问题是,如果 100 个请求通过上面的代码从网站 1 发送到网站 2,它们将逐个执行 (FIFO( 而不是并行执行。这意味着在第 30 个请求之后,一切都会超时。
问题是这些请求是不断完成的,它们的数量可能会增加,我需要 website2 才能以某种方式并行处理它们。我不能接受连续超时。服务器可以升级以拥有更多资源,这不是问题所在。
就像在任何动态服务器上一样,如果有 100 个人从他们的浏览器向网站 1 发送请求(通过单击按钮或刷新网站(,那么该请求由 website1 单独处理,当有人从网站 1 访问任何页面时,不会给其他 99 人中的任何一个人增加延迟,因为我假设 Apache 将每个请求分配给一个线程/worker。
我希望网站 2 处理来自 website1 的请求也是如此,基本上将每个请求作为不同的"请求者"处理并并行处理。
我假设这可能是一个 apache 设置或我需要添加到 cURL 请求中的标头中的东西,以便 website2 会认为该请求来自不同的 IP/访问者或类似的东西。
谁能指导我如何实现我需要的东西?
关于问题:
问题是,如果 100 个请求通过代码来自网站 1 以上,朝向网站2,它们是逐个执行的(FIFO(,而不是 并行。这意味着在第 30 个请求之后,一切都 超时。
如果在server2上运行apache,那么为什么website2应该一个接一个地执行它而不是并行执行呢?cURL访问网站2的方式与浏览器相同。
请求一个接一个地执行绝对不是真的。
阿帕奇:
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_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 端。