【问题标题】:Sending numerous files via HTTP POST & curl通过 HTTP POST 和 curl 发送大量文件
【发布时间】:2011-10-24 07:07:21
【问题描述】:

问题:

我无法通过 HTTP Post 可靠地将大量文件从一台 Web 服务器发送到另一台。

我注意到文件传输的成功与否取决于我选择发送的文件的大小和数量。

如果从源服务器发送的所有文件都出现在接收服务器的目录中,则我认为传输成功。

//sender script

$ch = curl_init();

$data = array(
    'file1' => '@/var/www/html/uploadtest/largerfile.zip',
    'file2' => '@/var/www/html/uploadtest/largerfile.zip',
    'file3' => '@/var/www/html/uploadtest/smallerfile.zip'
);

curl_setopt($ch, CURLOPT_URL, 'http://domain.com/test/reciever.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$res = curl_exec($ch);

if(curl_exec($ch)){
    print "Error: " . curl_error($ch);
}

echo $res;

//recieving script

print_r($_FILES); //outputs as blank array on failed transfer
move_uploaded_file( $_FILES["file1"]["tmp_name"], "file1.zip" );
move_uploaded_file( $_FILES["file1"]["tmp_name"], "file2.zip" );
move_uploaded_file( $_FILES["file1"]["tmp_name"], "file3.zip" );

随着当前文件的发送,它们都没有到达目的地。如果我删除一个 largerfile.zip 则文件传输成功。

我正在通过打印 $res 来查找错误响应,但尽管传输失败,但我没有看到任何响应。 *curl_errno* 也没有检测到任何东西。

背景:

之前有人建议我使用 FTP,但我将使用的 Web API 只接受 POST。我需要传输的文件也可能在 50mbs 左右。

我还尝试将以下 php.ini 设置更改为:

  • post_max_size : 100M
  • upload_max_size : 60M

【问题讨论】:

  • 不确定这是否有助于解决您的问题,但您可能需要查看curl_multi_init:php.net/manual/en/function.curl-multi-init.php
  • 传输失败通常需要多长时间?会不会和60s超时有关?
  • 您是将文件上传到自己的服务器,还是您上传到的服务器不受您控制?
  • @hakre 我正在使用的测试服务器在我的控制之下,但我最终将使用的服务器不在。
  • @AndersLindahl 传输在 60 秒前失败,每次失败通常在同一时间失败。例如,发送两个大文件让我在 10 秒左右失败,发送三个大文件让我在 10 秒左右再次失败。这个时间因我从哪个服务器发送文件而异。

标签: php curl file-transfer


【解决方案1】:

你写道:

我需要传输的文件也可能在 50mbs 左右。

我假设您指的是每个文件在硬盘上的文件大小。

max_upload_size : 60M(你不是说upload_max_filesize吗?!)
post_max_size : 100M

还有与文件上传相关的第三个设置:memory_limit。这是因为这些文件会先加载到内存中,然后再保存到服务器上的磁盘。

您想一次传输三个文件。每个文件大约 50 MB。总结一下吧:

50 mb + 50 mb + 50 mb = 150 mb

这意味着:

  • upload_max_filesize (!!) 的 60 mb 太低了,以防它同时计算所有三个文件(我不记得是否是这种情况)。
  • post_max_size 的 100 mb 肯定太低了,你需要一个更高的值,至少 150m 并在顶部添加更多。请参阅the manual entry 了解更多信息。
  • memory_limit 不详,但也太低了。

对于测试,将memory_limit 设置为0(无限制)并使用upload_max_filesizepost_max_size 来满足您的需求。

我希望这可以帮助您解决问题。

【讨论】:

  • 谢谢。我认为这已经成功了。我的memory_limit 在我的接收服务器上被设置得异常低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2010-11-11
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多