Swoole ist ein leistungsstarkes asynchrones netzwerkorientiertes Programmierframework, das auf PHP basiert. Es kann asynchrone E/A, Multiprozess-Multithreading, Coroutine und andere Funktionen realisieren und die Leistung von PHP bei der Netzwerkprogrammierung erheblich verbessern. In vielen Echtzeit- und Anwendungsszenarien mit hoher Parallelität ist Swoole zur ersten Wahl für Entwickler geworden. In diesem Artikel wird erläutert, wie Sie mit Swoole das Hochladen großer Dateien mit hoher Parallelität implementieren.
1. Probleme mit der herkömmlichen Lösung
Bei der herkömmlichen Datei-Upload-Lösung wird normalerweise die HTTP-POST-Anforderungsmethode verwendet, d. h. die Dateidaten werden über das Formular übermittelt, und dann empfängt das Backend die Anforderung und lädt sie dann hoch durch Auslesen der Dateidaten. Bei der Verarbeitung kleiner Dateien ist diese Methode ausreichend, bei der Verarbeitung großer Dateien treten jedoch viele Probleme auf:
Während des Datei-Upload-Vorgangs müssen die Daten der gesamten Datei gelesen werden erst hochgeladen werden, wenn es im Speicher ist. Wenn die übertragenen Dateien relativ groß sind, ist die Lesezeit sehr lang und PHP ist ein einzelner Prozess. Wenn eine große Anzahl von Datei-Upload-Anfragen vorliegt, wird der Dienstprozess blockiert und die Leistung des gesamten Servers beeinträchtigt .
Da die gesamten Dateidaten zum Hochladen in den Speicher eingelesen werden müssen, belegen sie viel Serverspeicher, was sich weiter auf die Leistung auswirkt.
Da die gesamten Dateidaten gelesen und hochgeladen werden müssen, bevor eine Antwort zurückgegeben wird, ist die Antwortzeit sehr lang, was zu einer schlechten Benutzererfahrung führt.
2. Lösung zum Hochladen großer Dateien basierend auf Swoole
Swoole kann Netzwerkanfragen auf zwei Arten verarbeiten: HTTP-Server und TCP-Server. Ersteres eignet sich eher für Webanwendungen, während letzteres für verschiedene benutzerdefinierte Netzwerkanwendungen und -protokolle verwendet wird. In diesem Artikel verwenden wir einen HTTP-Server, um ein Szenario zum Hochladen großer Dateien zu implementieren. Swoole bietet zwei integrierte Objekte, swoole_http_request und swoole_http_response, über die Informationen über HTTP-Anfragen und -Antworten abgerufen werden können.
a. Client-Anfrage
Der Client lädt Dateidaten über eine POST-Anfrage auf den Server hoch und der Server erhält die hochgeladenen Dateidaten über das swoole_http_request-Objekt.
b. Serverseitige Verarbeitung
Für jede Dateianforderung auf der Serverseite können wir die Datei-Upload-Informationen über das swoole_http_request-Objekt abrufen, einschließlich Dateiname, Dateityp, Dateigröße usw. Anschließend kann die Datei über die von Swoole bereitgestellte asynchrone Coroutine hochgeladen und in Blöcken gelesen und an den Zielserver (z. B. Alibaba Cloud Object Storage OSS) übertragen werden. Beim Hochladen von Dateien ist zu beachten, dass Sie für die Streaming-Datenübertragung die von Swoole bereitgestellte Coroutine-Methode verwenden können, wodurch sichergestellt werden kann, dass der Speicherbedarf relativ gering ist.
c. Serverantwort
Nachdem der Datei-Upload abgeschlossen ist, muss der Server dem Client einen erfolgreichen Upload und hochgeladene Dateiinformationen übermitteln. Da Swoole das Objekt swoole_http_response bereitstellt, um direkt auf http-Anfragen zu antworten, können wir es direkt verwenden, um dem Client zu antworten.
3. Codebeispiel
Das Folgende ist ein einfacher Beispielcode für eine große Datei-Upload-Lösung basierend auf Swoole.
<?php use SwooleHttpRequest; use SwooleHttpResponse; $http = new SwooleHttpServer("127.0.0.1", 9501); $http->on("request", function(Request $request, Response $response) { $filename = $request->files['file']['name']; $filepath = '/path/to/your/file' . $filename; $filesize = $request->header['content-length']; $tempPath = $request->files['file']['tmp_name']; $filetype = $request->files['file']['type']; $response->header("Content-Type", "application/json"); $response->header("Access-Control-Allow-Origin", "*"); $fp = fopen($tempPath, 'r'); $client = new SwooleCoroutineClient(SWOOLE_SOCK_TCP); $client->connect('your-oss-cn-addr', 'your-oss-cn-port'); $client->send("your-key"); $client->send("your-secret"); $client->send($filename); $client->send($filesize); $client->send($filetype); while (!feof($fp)) { $client->send(fread($fp, 8192)); } fclose($fp); $client->close(); $response->end(json_encode([ 'success' => true, 'message' => '文件上传成功' ])); }); $http->start();
4. Hinweise
Die Verwendung von Swoole erfordert das Starten der entsprechenden PHP-Erweiterung, die über den folgenden Befehl installiert werden kann:
pecl install swoole
Bei Verwendung von Swoole zum Hochladen Dateien, Es ist notwendig, die relevanten Parameter des Swoole-Servers zu konfigurieren. Beispielsweise müssen Sie die Anzahl der Arbeitsprozesse, den Grad der Aufzeichnung von Protokollinformationen, die Portnummer usw. festlegen, die je nach Bedarf festgelegt werden können. Im obigen Beispielcode haben wir den folgenden Code zur Konfiguration verwendet:
$http = new SwooleHttpServer("127.0.0.1", 9501);
Beim Hochladen von Dateien müssen die hochgeladenen Daten zwischengespeichert und verarbeitet werden, sodass sie beim Verarbeiten von Datei-Uploads möglicherweise viel Speicher beanspruchen . Erinnerung. Um Speicherüberlaufprobleme zu vermeiden, können Sie erwägen, die Datei in Blöcken zu lesen, jedes Datenelement nach dem Lesen zu übertragen und dann das nächste Datenelement zu lesen, nachdem die Übertragung abgeschlossen ist.
5. Zusammenfassung
In diesem Artikel wird erläutert, wie Sie mit Swoole das Hochladen großer Dateien mit hoher Parallelität erreichen. Im Vergleich zur herkömmlichen Datei-Upload-Methode kann die Verwendung von Swoole die Effizienz des Datei-Uploads erheblich verbessern und die Leistung des Servers verbessern. In tatsächlichen Anwendungen können das geeignete Upload-Schema und die Swoole-Parameterkonfiguration entsprechend den spezifischen Anforderungen ausgewählt werden.
Das obige ist der detaillierte Inhalt vonSwoole implementiert eine Lösung zum Hochladen großer Dateien mit hoher Parallelität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!