【问题标题】:Multi cURL only uploads one image多 cURL 只上传一张图片
【发布时间】:2013-12-04 18:41:02
【问题描述】:

我有以下代码将图像上传到外部服务器。问题是它只上传数组中的一张图片,而不是数组中的所有图片,问题出在哪里:)?

  $images = explode(',', $details['images']);
  $mh             = curl_multi_init();
  $sequenceNumber = 1;
  foreach ($images as $i => $url) {
      if (file_exists(dirname(dirname(__FILE__)) . '/tmp/' . $delad . '_' . $sequenceNumber . '.jpg')) {
          $uploadfile = dirname(dirname(__FILE__)) . '/tmp/' . $delad . '_' . $sequenceNumber . '.jpg';
      } else {
          copy($url, dirname(dirname(__FILE__)) . '/tmp/' . $delad . '_' . $sequenceNumber . '.jpg');
          $uploadfile = dirname(dirname(__FILE__)) . '/tmp/' . $delad . '_' . $sequenceNumber . '.jpg';
      }
      $conn[$i] = curl_init("http://*/image.html");
      curl_setopt($conn[$i], CURLOPT_POSTFIELDS, array(
          'sequenceNumber' => $sequenceNumber,
          'imageData' => "@" . $uploadfile . ";type=image/png",
          'filename' => $url
      ));
      curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, true);
      curl_setopt($conn[$i], CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
      curl_multi_add_handle($mh, $conn[$i]);
      $sequenceNumber++;
  }

  do { $n=curl_multi_exec($mh,$active); } while ($active);

  foreach ($images as $i => $url) {
       //$res[$i]=curl_multi_getcontent($conn[$i]);
       curl_multi_remove_handle($mh,$conn[$i]);
       curl_close($conn[$i]);
}
  curl_multi_close($mh);

$details['images'] 只是一个用逗号分隔的图片的 url 列表,例如

http://google.com/stackoverflow-logo.png,http://google.com/stackoverflow2.png

【问题讨论】:

  • 不清楚真正的问题是什么,因为我们看不到$details['images'] 的值,也看不到设置的接收方。如果您可以提供更多详细信息,应该有人可以提供帮助。
  • 我会将这个添加到帖子中,谢谢。我无法控制设置的接收方。
  • 嗯,部分问题在于接收方。就目前而言,您的脚本看起来不错。你控制接收方吗?也许那里的代码有问题。
  • 无法控制接收方,这很奇怪,因为当我在 foreach 中为图片 URL 做一个 curl 时,所有图片都会上传。
  • 嗯。好的。似乎接收端是因素。只需使用sleep 设置答案作为在上传之间暂停脚本的潜在解决方案,因为接收端似乎是问题所在。

标签: php arrays image curl upload


【解决方案1】:

在原始问题的 cmets 中,原始发帖人声明他们无法控制设置的接收端,但是当他们在 foreach 循环中执行单个 curl 时,图像会被上传。

如果是这样,可能接收方根本无法同时处理太多请求。所以我建议在你的脚本中添加一个sleep() 设置以在上传之间暂停,让接收方有机会赶上。

所以在第一个 foreach() 循环的最底部:

      curl_multi_add_handle($mh, $conn[$i]);
      $sequenceNumber++;
  }

像这样添加sleep() 命令:

      curl_multi_add_handle($mh, $conn[$i]);
      $sequenceNumber++;
      sleep(10);
  }

由于sleep() 使用秒,我已将其设置为 10 秒。根据您的脚本结果和应用需求随意调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2017-06-15
    • 2019-11-20
    相关资源
    最近更新 更多