Technischer Leitfaden zum Hoch- und Herunterladen großer Dateien in PHP

王林
Freigeben: 2023-05-21 10:00:02
Original
2060 Leute haben es durchsucht

Mit dem Aufkommen des mobilen Internetzeitalters wird die Notwendigkeit, große Dateien zu übertragen, immer häufiger. Unter anderem weist PHP als beliebte Programmiersprache eine gute Leistung beim Hoch- und Herunterladen großer Dateien auf. In diesem Artikel lernen wir die Technologie zum Hoch- und Herunterladen großer Dateien in PHP kennen, einschließlich wichtiger Technologien wie dem Umgang mit großen Dateien, Chunk-Uploads, fortgesetzten Uploads und asynchronen Downloads.

1. So verarbeiten Sie große Dateien in PHP

Der wichtigste Schritt bei der Verarbeitung großer Dateien in PHP ist die Planung eines geeigneten Speichernutzungsplans. Wir können die gesamte große Datei nicht direkt in den Speicher einlesen, da dies zu einem Speicherüberlauf und möglicherweise zum Absturz des gesamten Programms führt. Was ist also die Methode zur Verarbeitung großer Dateien in PHP?

Zunächst können wir das Konzept des „Dateizeigers“ verwenden, um dieses Problem zu lösen. Ein „Dateizeiger“ ist ein Zeiger in einer Datei, mit dem wir einen bestimmten Teil der Datei lesen können, anstatt die gesamte Datei auf einmal zu lesen. In PHP können wir die Funktionen fopen() und fread() verwenden, um Dateien zu öffnen und zu lesen.

Zweitens können wir die „Streaming“-Methode nutzen. Teilen Sie große Dateien zunächst in mehrere Teile auf und laden Sie sie dann Stück für Stück hoch oder herunter. Dadurch wird vermieden, dass die gesamte große Datei auf einmal gelesen wird, und die Datenintegrität wird gewährleistet.

2. Hochladen großer Dateien

Für die HTTP-Kommunikation beträgt die Standard-Upload-Dateigröße von PHP 2 MB, daher müssen wir die Option upload_max_filesize in der Konfigurationsdatei php.ini ändern, um das Hochladen größerer Dateien zu ermöglichen.

Aber auch nach der Änderung der php.ini-Datei treten beim Hochladen großer Dateien immer noch Probleme auf. Wie können wir Speicherlecks und Programmabstürze beim Hochladen vermeiden? Die Antwort besteht darin, die Chunked-Upload-Technologie zu verwenden.

  1. Chunked-Upload

Der sogenannte Chunked-Upload besteht darin, eine große Datei in Blöcke mit fester Größe aufzuteilen und diese dann Stück für Stück hochzuladen, bis der Upload abgeschlossen ist. Diese Methode vermeidet das gleichzeitige Lesen der gesamten Datei und verringert die Speicherbelastung des Servers.

Die spezifische Implementierung ist wie folgt:

Front-End-Code:

<input type="file" name="file" id="file">
Nach dem Login kopieren
var chunkSize = 1 * 1024 * 1024; //每一块的大小为1MB

var file = document.getElementById('file').files[0];
var name = file.name;
var size = file.size;

var chunkNum = Math.ceil(size / chunkSize); //总块数

for(var i=0;i<chunkNum;i++){

    var start = i*chunkSize;
    var end = Math.min(size,start+chunkSize);

    var chunk = file.slice(start,end); //将文件切成每个chunkSize大小的块

    //使用FormData上传
    var formData = new FormData();
    formData.append('chunk', chunk);
    formData.append('filename', i+'_'+name); //在文件名前加上块的编号

    //发起已经分割好的块的上传请求
    send(chunkUrl,formData);

}
Nach dem Login kopieren

Back-End-Code:

$chunk = $_FILES['chunk']; //获取文件块
$filename = $_POST['filename']; //获取文件名

//上传文件块
move_uploaded_file( $chunk['tmp_name'] , $upload.$filename);

echo "success";
Nach dem Login kopieren

Der obige Code implementiert die Aufteilung großer Dateien in mehrere 1-MB-Blöcke zum Hochladen und verteilt so den Druck.

  1. Fortsetzbarer Upload

Ein weiteres erwähnenswertes Problem besteht darin, dass wir den Upload dort fortsetzen können, wo er unterbrochen wurde, wenn der Upload einer großen Datei versehentlich abgebrochen wird.

Die Antwort ist die Verwendung der Breakpoint-Resume-Technologie. Wir können den Fortschritt des Datei-Uploads während des Hochladens der Datei aufzeichnen und dann, wenn der Benutzer erneut hochlädt, die nicht abgeschlossenen Dateiblöcke des letzten Uploads zwischenspeichern, damit sie später erneut hochgeladen werden können.

Die spezifische Implementierung lautet wie folgt:

Front-End-Code:

var chunkSize = 1 * 1024 * 1024; //每一块的大小为1MB

var file = document.getElementById('file').files[0];
var name = file.name;
var size = file.size;

var chunkNum = Math.ceil(size / chunkSize); //总块数

for(var i=0;i<chunkNum;i++){

    var start = i*chunkSize;
    var end = Math.min(size,start+chunkSize);

    var chunk = file.slice(start,end); //将文件切成每个chunkSize大小的块

    //使用FormData上传
    var formData = new FormData();
    formData.append('chunk', chunk);
    formData.append('filename', i+'_'+name); //在文件名前加上块的编号
    formData.append('chunkNum',chunkNum); //总块数
    formData.append('index',i); //当前块的编号

    //将文件分块上传
    send(chunkUrl,formData,function(){ 

        uploaded[i] = 1; //标记该块已上传
        var uploadedAll = uploaded.every(v => v == 1); //检查是否所有块都已上传

        //如果所有块都已上传,则在服务端组装文件
        if(uploadedAll){

            var formData = new FormData();
            formData.append('name', name);
            formData.append('chunkNum',chunkNum); //总块数

            //发起文件组装请求
            send(mergeUrl,formData,function(response){

                console.log(response);

            });

        }

    });

}
Nach dem Login kopieren

Back-End-Code:

$chunk = $_FILES['chunk']; //获取文件块
$filename = $_POST['filename']; //获取文件名
$chunkNum = $_POST['chunkNum']; //获取文件总块数
$index = $_POST['index']; //获取当前块的编号

//上传文件块
move_uploaded_file( $chunk['tmp_name'] , $upload.$filename);

//上传完成后检查所有块是否已上传
$uploaded = $this->isUploaded($upload,$chunkNum);
if($uploaded){
    $this->mergeFile($upload,$chunkNum,$name); //组装文件
}

echo "success";
Nach dem Login kopieren

Der obige Code implementiert das Hochladen von Dateien in Teilen, markiert den Upload-Fortschritt auf dem Client und überprüft, ob der Upload erfolgt auf dem Server abgeschlossen. Wenn der Upload abgeschlossen ist, werden alle hochgeladenen Dateiblöcke zusammengefügt.

3. Herunterladen großer Dateien

Beim Herunterladen großer Dateien in PHP müssen wir auch die Probleme von Speicherlecks und Programmabstürzen lösen. Hierfür können wir die asynchrone Download-Technologie nutzen.

Asynchrones Herunterladen bedeutet, dass die Download-Anfrage in einem separaten Thread platziert wird, um eine Blockierung des Haupt-Threads des Servers zu vermeiden. In PHP können wir die Funktion exec() verwenden, um einen separaten Thread zu starten.

Die spezifische Implementierung lautet wie folgt:

Front-End-Code:

<a href="#" onclick="download()">下载</a>
Nach dem Login kopieren
function download(){

    var filename = 'test.zip'; //准备下载文件名

    //发起异步下载请求
    var ajax = new XMLHttpRequest();
    ajax.open('GET', '/download.php?filename='+filename, true);
    ajax.send();

}
Nach dem Login kopieren

Back-End-Code:

$action = isset($_GET['action']) ? $_GET['action'] : 'download'; //获取下载动作
$filename = $_GET['filename']; //获取文件名

if($action == 'download'){

    //启动异步下载
    exec('php download.php '.$filename.' > /dev/null &'); 

}else{

    //文件下载
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".$filename);
    header("Accept-Ranges: bytes");

    $file = fopen($download.$filename,"r");
    if($file){

        while(!feof($file)){
            print(fread($file, 1024*8 ));
            flush();
            ob_flush();
        }

    }
    fclose($file);

}
Nach dem Login kopieren

Der obige Code implementiert eine asynchrone Download-Anfrage auf dem Client, und das Backend verwendet zum Starten die Funktion exec() Ein separater Thread für die Download-Aktion, wodurch das Problem der Blockierung des Hauptthreads vermieden wird. Gleichzeitig wird auch das Speicherproblem beim Herunterladen von Dateien durch den Chunked-Download und die Ausgabe in den Puffer gelöst.

4. Zusammenfassung

In diesem Artikel haben wir die Technologie zum Hochladen und Herunterladen großer Dateien in PHP kennengelernt, insbesondere den Umgang mit großen Dateien, Chunked Upload, Breakpoint Resume und asynchronem Download sowie anderen Technologien. Durch die Anleitung dieses Artikels können wir die Techniken zur Verarbeitung großer Dateien in PHP besser beherrschen und diese Techniken in tatsächlichen Projekten anwenden, um eine effiziente Übertragung großer Dateien zu erreichen.

Das obige ist der detaillierte Inhalt vonTechnischer Leitfaden zum Hoch- und Herunterladen großer Dateien in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage