Php 多个请求上的网关超时504。阿帕奇

Php 多个请求上的网关超时504。阿帕奇,php,xml,http-status-code-504,Php,Xml,Http Status Code 504,我在本地有一个XML文件。它包含来自市场的数据。 大致如下: <offer id="2113"> <picture>https://anotherserver.com/image1.jpg</picture> <picture>https://anotherserver.com/image2.jpg</picture> </offer> <offer id="2117"> <pict

我在本地有一个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>
...
也一样,但运气不好

有没有办法在不分块请求的情况下做到这一点

此错误是否发生在某个图像上?如果可以的话,捕捉到这个错误或者跟踪响应延迟,在一段时间后发送另一个请求会更好吗

是否有任何以秒为单位的固定时间,我必须等待以使这些请求滚动

如果可能的话,请给我非卷曲的答案

更新

Curl和exec(wget)也不起作用。他们都犯了同样的错误

可以调整远程服务器,使其不会阻止我吗?(如果有)


p、 如果我这样做:
echo”
在所有12000个图像的循环中,它们显示得很好。

由于您在无法控制的服务器上访问内容,只有服务器管理员知道相应的阻止规则

但您有以下几种选择:

  • 运行1000个左右的批次,然后睡眠几个小时
  • 在请求信息的计算机之间拆分请求
  • 甚至像每1000张左右的图片更改请求的用户代理信息这样简单的事情也足以绕过阻塞机制
  • 或者上述所有因素的某种组合

    • 我建议您尝试以下内容 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
      
    • 如果可以通过https和http访问图像,请尝试改用http。(这至少会加快下载速度)
    • 返回504以及加载浏览器url时检查响应标题。确保没有X-RateLimit-*标题。顺便问一下,响应标题实际上是什么

    • 用户代理没有帮助。1000个批次无法执行,因为不能等待几个小时。当我尝试保存文件时,会发生错误,但当我只是
      echo““
      它出现在浏览器页面上。我想我可以试着通过javascript检查所有的图片,获取base64的图片,并将这些数据保存为一个图片文件?还是我遗漏了一些非常重要的东西?我很好奇为什么卷曲不适合你?它会为您显示浏览器中的所有图像吗?我最近做了一个项目,我使用wget从一个站点抓取了数万个html页面。但它不是php,我以shell脚本的形式运行它,所以我可以执行exec()并运行wget,在变量中传递图像url-s,它会正常工作吗?我从来没用过wget,我能那样用吗?我需要这个尽可能快地工作,正如我读到的,CURL的速度要慢得多。给我一些,我会清理我使用的脚本并将其粘贴到答案中。(对于注释来说太长了)。我运行了另一个脚本来登录并保存cookie,但下面是一个示例。但它却占据了整个html页面…#/bin/bash m=1,而[$m-lt 20350];do wget--load cookies cookies.txt \--header=“Accept:text/html”\--user agent=“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/69.0.3497.100 Safari/537.36”\let m=m+1 sleep.25完成
      如果我这样做:echo“
      PS您在这里的报价是错误的。src属性中有一个双引号,而不是字符串末尾的双引号,这是一个语法错误。我想这可能是问题中的一个输入错误。通常我通过使用代理来解决类似的问题,这样你就可以将请求分散到多个IP地址上。但是这是
      ,如果可能的话,请给我非卷曲的答案。
      我会试一试。你发帖的时候我试过,但没有运气。我转移到项目的其他部分,很快就要回到这个部分。希望到时候我会有一些答案。
      $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