2014-05-14 72 views
0

我試圖直接在我的服務器上使用波紋管php-curl腳本下載視頻文件,但在獲取120MB左右的文件後停止下載,文件多於500MB,其中一些是1GB和1.5GB。我搜查了很多,但沒有得到任何解決。我正在共享主機上運行。PHP將大文件下載到大小超過1GB的服務器

if ($url) { 
    $file_loc = 'moviez/' . $name; 
    $fp = fopen($file_loc, 'w+'); 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 0); 
    curl_setopt($ch, CURLOPT_FILE, $fp); 
    curl_exec($ch); 
    curl_close($ch); 
    fclose($fp); 
} 
+0

你應該檢查'upload_max_filesize'在'php.ini'設置,請參閱[這裏](http://stackoverflow.com/questions/2184513/php-更改最大上傳文件大小) – celeriko

+0

因爲m運行在共享主機,我沒有權限來改變這一點。我還要求管理員增加連接時間,但他們否認並要求我找到任何其他想法。 –

+0

下載將被上傳,因爲你把它放在「在服務器上」:) – DannyG

回答

0

我懷疑腳本可能超時。如果我沒有記錯的話,默認值是30秒。您的主機也可能會限制您的腳本運行時間。你可以使用ini_set('max_execution_time',nnn)來增加超時。

編輯:更重要的是,使用set_time_limit()函數,這將引發錯誤:

Warning: set_time_limit(): Cannot set time limit in safe mode

,如果你的主機是限制你。

+0

我已經添加set_time_limit(0),但沒有關於此錯誤。 –

0

正如Luke所說,您的腳本在您的下載完成之前會超時。 設置max_execution_time的問題是僅影響上傳。

您的解決方案應該由readfile()或file_get_contents()來處理。偉大的來源是在這裏找到:http://www.ibm.com/developerworks/library/os-php-readfiles/index.html?ca=drs

編輯:Max_execution_time和max_input_time之間有一點混淆。

編輯二:實例,

<?php 
$file = $_GET['file']; 
header ("Content-type: octet/stream"); 
header ("Content-disposition: attachment; filename=".$file.";"); 
header("Content-Length: ".filesize($file)); 
readfile($file); 
exit; 
?> 


<a href="direct_download.php?file=batman.mkv">Download the batman</a> 
+0

但是這將從瀏覽器端開始下載,而是我想將內容保存在服務器上。 –

+0

呵呵,我在你的問題中被「下載」這個詞搞糊塗了!您正在尋找上傳到您的服務器。 您將在php.ini中查看max_input_time。在這裏:http://www.php.net/manual/en/info.configuration.php#ini.max-input-time –

+0

以及我沒有訪問php.ini,也在簡單的話我的問題是試圖從YouTube上將視頻文件保存到我的服務器。這是超過1GB的大小。但是在取得100mb左右的腳本後,我的腳本返回這個錯誤....「Request Timeout這個請求需要很長的時間來處理,它由服務器超時。如果不應該超時,請聯繫本網站的管理員以增加'連接超時'。」 –

0

檢查這個腳本。它對我下載大於500MB的文件效果很好。

Light Weight PHP Script To Download Remote File To Local Server

<?php 
// maximum execution time in seconds 
set_time_limit (24 * 60 * 60); 
if (!isset($_POST['submit'])) die(); 
// folder to save downloaded files to. must end with slash 
$destination_folder = 'files/'; 
$url = $_POST['url']; 
$newfname = $destination_folder . basename($url); 
$file = fopen ($url, "rb"); 
if ($file) { 
    $newf = fopen ($newfname, "wb"); 
if ($newf) 
    while(!feof($file)) { 
    fwrite($newf, fread($file, 1024 * 8), 1024 * 8); 
    } 
} 
if ($file) { 
    fclose($file); 
} 
if ($newf) { 
    fclose($newf); 
} 
?> 
相關問題