2011-08-10 151 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