我使用的 API 对一小时内的请求数有一定的限制。但我的脚本一次完成所有请求,因此我丢失了大约 1/3 的请求,因为我得到了 403。
有没有什么方法可以检查 wget 的响应,如果我得到 403 则等待 5 分钟并重试?
以下是我的(目前)测试代码:
system ("wget \"http://test-link.com/403/\" -O {$dir}/{$in_dir_counter}.xml");
$test = system ("wget \"http://test-link.com/403/\" -O {$dir}/{$in_dir_counter}.xml");
echo "responsed - ".$test;
两者返回相同。
答案1
如何使用一个简单的脚本来实现这一点:
- 每 5 分钟运行一次脚本,除非它已经在运行。
- 检查本地文件的使用期限。如果超过特定阈值,则重新下载。
因此,如果一切顺利,则不会发生任何事情,除非文件已过期。如果文件已过期且下载失败,您可以重试下一次迭代。
我不确定你为什么用 标记它php
,但如果你实际上正在运行一个 php 脚本,这种方法相当容易做到(假设你已经启用了 web 套接字):
foreach($files as $file)
if (@filemdate($local_path + $file) + $cache_duration < time())
@copy($remote_path + $file, local_path + $file);
请注意,$remote_path
确实可以是 HTTP 或 FTP URL。无需调用 wget。这@
将阻止打印错误消息。
为了证明这不会导致不必要的等待:
- 假设您有 1000 个文件需要下载,但每小时最多只能下载 250 个文件。
- 设置
cache_duration
为您将获取所有文件的保存时间,例如 24 小时(24 * 60 * 60
)。 - 每小时重新运行上述脚本一次。
- 第一次迭代将更新前 250 个文件。其余文件将失败。
- 第二次迭代将跳过前 250 个文件(因为足够新)并下载接下来的 250 个文件。
- 第四次迭代后,您将更新/下载所有 1000 个文件。
- 当然,您可以设置更短的间隔,例如 5 分钟,但这会产生更多的请求/流量(取决于是否可以接受)。
备选脚本思路:
- 尝试下载一个文件。
- 如果失败,您应该能够根据 wget 的返回值/退出代码确定。因此在这种情况下等待 5 分钟,然后重复。