2011-08-10 127 views
0

问题大量文件:发送通过HTTP POST和卷曲

我有通过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"); 

随着目前的文件被发送到他们没有到达他们的目的地。如果我删除一个largefile.zip那么文件传输成功。

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

背景:

我一直建议以前使用FTP,但我会使用Web API只接受POST。我需要传输的文件也可能在50mb左右。

我也试图改变以下php.ini中设置:

  • 的post_max_size:100M
  • upload_max_size:60M
+0

不知道这是否有助于你的问题,但你可能想看看'curl_multi_init':http://php.net/manual/en/function.curl-multi-init.php –

+1

多久转移失败之前通常需要转移吗?它可能与60年代的超时有关吗? –

+0

你正在上传文件到你自己的服务器,还是你上传的服务器不在你的控制之下? – hakre

回答

2

您写道:

这也是可能我需要传输的文件大约是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_limit0(无限)和玩upload_max_filesizepost_max_size,以满足您的需求。

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

+0

感谢。我认为这已经完成了技巧..我的接收服务器上我的memory_limit被设置得异常低。 – Aaron