2013-09-23 96 views
2

我有一個用於下載mp4 videp文件的php腳本。它現在正在適用於小尺寸文件(測試高達60 MB)。當我嘗試一個大的(300 MB)時,它顯示與「內存限制」相關的錯誤。因此,在ini文件中進行了一些編輯,將內存限制增加到400 MB(memory_limit = 400M)。然後我嘗試運行我的腳本,但下載框顯示的內容大小爲189個字節。我用另一個mp4文件(小尺寸)試了一下,效果很好。我不明白它的原因。所以請親切指導我。我的腳本如下..在php下載問題

$file = $_SERVER['DOCUMENT_ROOT']."/folder_name/filename.mp4"; 
$filesize = filesize($file); 
$fileName=$file; 
$offset = 0; 
$length = $filesize; 

if (isset($_SERVER['HTTP_RANGE'])) { 

    $partialContent = true; 

    preg_match('/bytes=(\d+)-?/', $_SERVER['HTTP_RANGE'], $matches); 

    $offset = intval($matches[1]); 
    $length = $filesize - $offset; 
}else { 
    $partialContent = false; 
} 

$file = fopen($file, 'r'); 

fseek($file, $offset); 

$data = fread($file, $length); 

fclose($file); 

if ($partialContent) { 

    header('HTTP/1.1 206 Partial Content'); 

    header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $filesize); 
} 

header("Content-type: video/mp4"); 
header('Content-Length: ' . $filesize); 
header('Content-Disposition: attachment; filename="' . $fileName . '"'); 
header('Accept-Ranges: bytes'); 
print($data); 

下載框,顯示是..

enter image description here

+1

如果顯示的189個字節的腳本可能出錯了內容大小和文件的內容可能會成爲其中的文本錯誤,請在文本編輯器中打開文件並查看。 –

+0

嘗試'ini_set('memory_limit','300M'); '但是,如果你不需要做任何形式的驗證,爲什麼不把mp4文件放在一個目錄中並讓用戶直接從服務器上下載? – Reinherd

+0

@ Patrick Evans:非常感謝。正如你所說的,「允許的內存大小***字節耗盡」,所以我在腳本中添加了一行代碼(ini_set('memory_limit','-1'))。現在pblm解決了..謝謝很多.. :) – DjangoDev

回答

-1

請與您的服務器檢查某個時候您的服務器不支持那麼多的內存分配給你的腳本。

請在腳本上添加以下行。

ini_set('memory_limit', '-1'); 
ini_set('max_execution_time', '0'); 

然後讓我知道如果這不起作用。

+1

不好。默認情況下,PHP使用這些指令來防止內存過度使用。不要刪除這些限制或服務器將非常耗費內存。 – Raptor

-2

如果沒有很好的理由更改所有指令是不好的,所以第一步是要知道你有什麼具體問題。

當你運行一個下載文件的腳本,例如在這種情況下,mp4視頻文件,並且下載框顯示的內容尺寸比實際文件小得多,它很容易得到有關錯誤的線索:

你只需要下載該文件,無論它看起來像一個視頻,用文本編輯器打開它。

右鍵>用...打開...然後選擇任意文本編輯器。

您會發現文件的實際內容是關於服務器中發生錯誤的信息。有了這個,你將獲得關於發生的事情的更好的信息,例如,如果它與memory_limit,max_execution_time或任何其他原因相關,就可以找出它們。

現在您可以決定更改一個或多個指令,或者更改腳本以獲得更好的性能。

注意:如果您下載的文件爲空,或者不包含任何錯誤信息,可能是您禁用了錯誤報告。要啓用它,你可以在腳本的開頭添加這兩條線:

ini_set("display_errors","1"); 
error_reporting(E_ALL); 
+0

你應該清理這個答案,包括單詞選擇/句子結構,並儘可能提供代碼示例。 –

+0

我甚至不確定這個答案真的與所問的問題有關。當然,這並不能很好地把握這個問題或者已經被嘗試和看到的東西。 –

+0

謝謝納撒尼爾,我會盡力改進我的寫作。 安德魯,即時通訊對不起,我解釋得很糟糕,你甚至不知道它是否與問題有關。就是,讓我編輯它來解釋我想說的話。我是新的在stackoverflow和id喜歡有幫助,所以這些評論都很好。 –