php - 多个请求的网关超时 504。阿帕奇
问题描述
我在本地有一个 XML 文件。它包含来自市场的数据。它大致看起来像这样:
<offer id="2113">
<picture>https://anotherserver.com/image1.jpg</picture>
<picture>https://anotherserver.com/image2.jpg</picture>
</offer>
<offer id="2117">
<picture>https://anotherserver.com/image3.jpg</picture>
<picture>https://anotherserver.com/image4.jpg</picture>
</offer>
...
我想要的是将这些图像保存在<picture>
节点本地。
大约有9,000 个报价和大约14,000 张图像。
当我遍历它们时,我看到图像正在从另一台服务器复制,但在某些时候它给出了504 Gateway Timeout
.
问题是有时会在 2,000 张图像之后或多或少地给出错误。
我尝试从该服务器(即仅https://anotherserver.com/image3.jpg
)仅获取一个图像 12,000 次,但它仍然给出了相同的错误。
正如我所读到的,另一台服务器在一定数量后阻止了我的请求。
我尝试PHP sleep(20)
在每 100 张图像后使用,但它仍然给了我同样的错误(sleep(180) - same
)。当我尝试本地图像但使用完整路径时,它没有给出任何错误。尝试了第二台服务器(非本地)同样的事情发生了。
我使用PHP copy()
函数从该服务器移动图像。我刚刚用于file_get_contents()
测试目的,但得到了同样的错误。
我有
set_time_limit(300000);
ini_set('default_socket_timeout', 300000);
也一样,但没有运气。
有没有办法在不分块请求的情况下做到这一点?
此错误是否发生在某个图像上?如果可以做到这一点,捕捉这个错误或者只是跟踪响应延迟以在一段时间后发送另一个请求会很好吗?
为了让这些请求滚动,我必须等待几秒钟的恒定时间吗?
如果可能的话,请给我非卷曲的答案。
更新
Curl 和 exec(wget) 也不能正常工作。他们都犯了同样的错误。
可以调整远程服务器使其不会阻止我吗?(如果是的话)。
ps 如果我这样做:echo "<img src = 'https://anotherserver.com/image1.jpg'" />
在所有 12,000 张图像的循环中,它们显示得很好。
解决方案
由于您正在访问您无法控制的服务器上的内容,因此只有服务器管理员知道阻止规则。
但是您有几个选择,如下所示:
- 运行 1000 个左右的批次,然后睡几个小时。
- 在请求信息的计算机之间拆分请求。
- 甚至像每 1000 张左右的图像更改请求的用户代理信息这样简单的事情也足以绕过阻塞机制。
- 或以上所有内容的某种组合。
推荐阅读
- r - 如何为具有多个/嵌套值的目标列拆分数据框中的行
- service-worker - 无法使用脚本 ('https://*.com/service-worker.js') 为范围 ('https://*.com/') 注册 ServiceWorker:无法访问存储
- javascript - amChart 地图 | 识别移动设备上的点击行为
- javascript - 在运行谷歌脚本以从 AD 获取用户数据后,如何在我的谷歌工作表中省略“类型”和“值”这两个词?
- arrays - 如何快速找到数组元素中的最大数?
- javascript - ASP.NET javascript 在 remmed 代码上执行
- typescript - Typescript 条件返回类型:基于参数的对象或对象数组
- flutter - 如何使用动画滚动到 Flutter 中的下一行位置
- angular - 侧画菜单不显示
- terraform - 通过 sops exec-file 运行 terraform 计划