2010-01-08 106 views
0

是file_get_contents()足以下載位於服務器上的遠程電影文件嗎?是php file_get_contents()足以下載電影嗎?

我只是想,也許存儲大型電影文件到字符串是有害的?根據PHP文檔。

或者我需要使用cURL嗎?我不知道cURL。

更新:這些都是大電影文件。每個大約200MB。

+4

「我不知道cURL。」 - 這並不難學... http://www.php.net/curl – 2010-01-08 03:59:52

+5

這些文件有多大?系統上的內存有多大? – mopoke 2010-01-08 04:00:47

+0

我相信你可以將字符串存儲到PHP中的memory_limit指令的長度(準確地說,稍微小於memory_limit,這是因爲在同一個腳本中的其他PHP代碼也會佔用這個限制)。 – 2010-01-08 04:03:19

回答

1

爲了獲得最佳性能,您可能會發現僅使用像WGET這樣的標準unix util是有意義的。你應該能夠與系統調用它(「wget的......」)或者exec() http://www.php.net/manual/en/function.system.php

+1

cURL的優點是不會產生一個單獨的進程,對於大量的請求,這是一個巨大的優勢。 – 2010-01-08 05:39:26

2

@mopoke建議它可能取決於文件的大小。對於一部小電影來說就足夠了。總的來說,我認爲cURL會更好。與file_get_contents()相比,您擁有更多的靈活性。

3

file_get_contents()是一個問題,因爲這將整個文件加載到內存中一氣呵成。如果你有足夠的內存來支持操作(考慮到如果這是一個Web服務器,你可能會有多個命中同時產生這種行爲,因此每個都需要那麼多的內存),那麼file_get_contents()應該沒問題。但是,這不是正確的方式 - 你應該使用專門用於這類操作的庫。正如其他人所提到的,cURL可以做到這一點,或者wget。使用fopen('http://someurl', 'r')並讀取文件中的塊,然後將它們直接轉儲到已打開以獲取寫入權限的本地文件,您也可能獲得好運。

+1

閱讀文檔。 'file_get_contents()'也支持塊讀取文件。 – 2010-01-08 04:59:09

+0

它在哪裏說的? – 2010-01-08 05:04:43

+0

自PHP 5.1起,file_get_contents具有「offset」和「maxlen」的參數。我知道 - 這也是我的新聞。但是,一個問題是:多次調用file_get_contents()不可避免地關閉並重新打開有問題的「文件」 - 我假設通過file_get_contents()通過HTTP下載200兆字節文件的最後一個字節可能會很好地下載所有200 MB 。這是值得測試的,儘管沒有理由不使用fopen()來代替。 – 2010-01-08 05:44:21

0

您可以使用fread()一次讀取幾個字節。

$src="http://somewhere/test.avi"; 
$dst="test.avi"; 
$f = fopen($src, 'rb'); 
$o = fopen($dst, 'wb'); 
while (!feof($f)) { 
    if (fwrite($o, fread($f, 2048)) === FALSE) { 
     return 1; 
    } 
} 
fclose($f); 
fclose($o); 
+0

我在我的網站上使用這個,但要小心 - 記住腳本最大執行時間。 – 2010-01-08 07:49:39