Swoole は、PHP をベースにした高性能な非同期ネットワーク指向プログラミング フレームワークで、非同期 IO、マルチプロセス マルチスレッド、コルーチンなどの機能を実現し、ネットワーク プログラミングにおける PHP のパフォーマンスを大幅に向上させることができます。多くのリアルタイムおよび同時実行性の高いアプリケーション シナリオでは、Swoole が開発者にとっての最初の選択肢となっています。この記事では、Swoole を使用して大規模ファイルの同時アップロードを実装する方法を紹介します。
1. 従来のソリューションの問題
従来のファイル アップロード ソリューションでは、通常、HTTP POST リクエスト メソッドが使用されます。つまり、ファイル データはフォームを通じて送信され、バックエンドが受信します。次に、ファイルデータを読み取ってアップロードします。小さなファイルを処理する場合はこの方法で十分ですが、大きなファイルを処理する場合は多くの問題が発生します。
ファイルがアップロードされるとき プロセス中に、アップロードする前に、ファイル全体のデータをメモリに読み取る必要があります。転送されるファイルが比較的大きい場合、読み込み時間が非常に長くなり、PHP が単一プロセスであるため、ファイルのアップロード要求が大量にある場合、サービスのプロセスがブロックされ、サーバー全体のパフォーマンスに影響を及ぼします。 。
アップロードするにはファイル データ全体をメモリに読み込む必要があるため、大量のサーバー メモリが占有され、パフォーマンスにさらに影響します。
応答が返される前にファイル データ全体を読み取ってアップロードする必要があるため、応答時間が非常に長くなり、ユーザーのパフォーマンスが低下します。経験は良いです。
2. Swoole に基づく大容量ファイル アップロード ソリューション
Swoole は、HTTP サーバーと TCP サーバーの 2 つの方法でネットワーク リクエストを処理できます。前者は Web アプリケーションにより適しており、後者はさまざまなカスタム ネットワーク アプリケーションおよびプロトコルに使用されます。この記事では、HTTP サーバーを使用して大きなファイルのアップロード シナリオを実装します。 Swoole には、swoole_http_request と swoole_http_response という 2 つの組み込みオブジェクトが用意されており、これらのオブジェクトを通じて HTTP リクエストと応答に関する情報を取得できます。
a. クライアント リクエスト
クライアントは POST リクエストを通じてファイル データをサーバーにアップロードし、サーバーはアップロードされたデータを取得します。 swoole_http_request オブジェクトを介したデータ ファイル データ。
b. サーバー側の処理
サーバー側のファイル リクエストごとに、ファイル名、ファイル タイプ、ファイル サイズなどを含むファイル アップロード情報を swoole_http_request オブジェクトを通じて取得できます。 。その後、Swoole が提供する非同期コルーチンを介してファイルをアップロードし、ファイルをチャンクで読み取り、ターゲット サーバー (Alibaba Cloud Object Storage OSS など) に転送できます。ファイルをアップロードするときに注意する必要があるのは、ストリーミング データ送信に Swoole が提供するコルーチン メソッドを使用できるため、メモリ使用量を比較的小さくできることです。
c. サーバーの応答
ファイルのアップロードが完了した後、サーバーはクライアントにアップロードの成功とアップロードされたファイルの情報を提供する必要があります。 Swoole は http リクエストに直接応答するための swoole_http_response オブジェクトを提供しているため、それを直接使用してクライアントに応答できます。
3. コード例
以下は、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. 注意事項
Swoole を使用するには、対応する PHP 拡張機能を開始する必要があり、次のコマンドでインストールできます。
pecl install swoole
Swoole を使用してファイルをアップロードする場合、Swoole サーバーの関連パラメーターを構成する必要があります。たとえば、ワーカープロセスの数、ログ情報の記録レベル、ポート番号などを設定する必要があり、ニーズに応じて設定できます。上記のサンプル コードでは、構成に次のコードを使用しました。
$http = new SwooleHttpServer("127.0.0.1", 9501);
ファイルをアップロードするとき、アップロードされたデータはキャッシュされて処理される必要があります。したがって、ファイルのアップロードを処理するときに大量のメモリが使用される可能性があります。メモリ オーバーフローの問題を回避するには、ファイルをチャンクに分けて読み取り、読み取り後に各データを送信し、送信の完了後に次のデータを読み取ることを検討できます。
5. 概要
この記事では、Swoole を使用して大きなファイルの同時アップロードを実現する方法を紹介します。従来のファイルアップロード方法と比較して、Swooleを使用するとファイルアップロードの効率が大幅に向上し、サーバーのパフォーマンスが向上します。実際のアプリケーションでは、特定のニーズに応じて、適切なアップロード スキームと Swoole パラメーター構成を選択できます。
以上がSwoole は、同時実行性の高い大規模ファイルのアップロード ソリューションを実装していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。