我有一个本地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张图像后,有时会或多或少地出现错误。
我尝试仅从该服务器获取12,000次图像(即仅https://anotherserver.com/image3.jpg
),但仍然出现相同的错误。
正如我所阅读的,在经过一定数量之后,另一台服务器阻止了我的请求。
我尝试在每100张图像后使用PHP sleep(20)
,但仍然给我相同的错误(sleep(180) - same
)。当我尝试本地图像但具有完整路径时,它没有给出任何错误。尝试过第二台服务器(非本地)也发生了同样的事情。
我使用PHP copy()
函数从该服务器移动图像。
我刚刚使用file_get_contents()
进行测试,但是遇到了相同的错误。
我有
set_time_limit(300000);
ini_set('default_socket_timeout', 300000);
也没有运气。
是否有任何方法可以将请求分块?
在某个图像上是否发生此错误?如果可以做到这一点,那么捕捉该错误或者只是跟踪响应延迟以在一段时间后发送另一个请求会很棒吗?
为了让那些请求滚动,我是否需要等待几秒钟的恒定时间?
如果可能,请给我非卷曲的答案。
更新
Curl和exec(wget)不能正常工作。他们俩都犯了同样的错误。
可以对远程服务器进行调整,使其不会阻止我吗? (如果有)。
p.s。如果我这样做:echo "<img src = 'https://anotherserver.com/image1.jpg'" />
循环显示所有12,000张图像,则它们显示得很好。
答案 0 :(得分:2)
由于您正在访问服务器上的内容,因此无法控制,只有服务器管理员知道适当的阻止规则。
但是您有一些选择,如下所示:
答案 1 :(得分:0)
我建议您尝试关注 1.使用CURL重用以前打开的连接
$imageURLs = array('https://anotherserver.com/image1.jpg', 'https://anotherserver.com/image2.jpg', ...);
$notDownloaded = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
foreach ($imageURLs as $URL) {
$filepath = parse_url($URL, PHP_URL_PATH);
$fp = fopen(basename($filepath), "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_URL, $URL);
curl_exec($ch);
fclose($fp);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) == 504) {
$notDownloaded[] = $URL;
}
}
curl_close($ch);
// check to see if $notDownloaded is empty