ホームページ  >  記事  >  PHPフレームワーク  >  Swoole は、同時実行性の高い大規模ファイルのアップロード ソリューションを実装しています

Swoole は、同時実行性の高い大規模ファイルのアップロード ソリューションを実装しています

PHPz
PHPzオリジナル
2023-06-13 20:20:022107ブラウズ

Swoole は、PHP をベースにした高性能な非同期ネットワーク指向プログラミング フレームワークで、非同期 IO、マルチプロセス マルチスレッド、コルーチンなどの機能を実現し、ネットワーク プログラミングにおける PHP のパフォーマンスを大幅に向上させることができます。多くのリアルタイムおよび同時実行性の高いアプリケーション シナリオでは、Swoole が開発者にとっての最初の選択肢となっています。この記事では、Swoole を使用して大規模ファイルの同時アップロードを実装する方法を紹介します。

1. 従来のソリューションの問題

従来のファイル アップロード ソリューションでは、通常、HTTP POST リクエスト メソッドが使用されます。つまり、ファイル データはフォームを通じて送信され、バックエンドが受信します。次に、ファイルデータを読み取ってアップロードします。小さなファイルを処理する場合はこの方法で十分ですが、大きなファイルを処理する場合は多くの問題が発生します。

  1. プロセスに時間がかかります

ファイルがアップロードされるとき プロセス中に、アップロードする前に、ファイル全体のデータをメモリに読み取る必要があります。転送されるファイルが比較的大きい場合、読み込み時間が非常に長くなり、PHP が単一プロセスであるため、ファイルのアップロード要求が大量にある場合、サービスのプロセスがブロックされ、サーバー全体のパフォーマンスに影響を及ぼします。 。

  1. メモリ使用量

アップロードするにはファイル データ全体をメモリに読み込む必要があるため、大量のサーバー メモリが占​​有され、パフォーマンスにさらに影響します。

  1. 長い応答時間

応答が返される前にファイル データ全体を読み取ってアップロードする必要があるため、応答時間が非常に長くなり、ユーザーのパフォーマンスが低下します。経験は良いです。

2. Swoole に基づく大容量ファイル アップロード ソリューション

  1. 原理紹介

Swoole は、HTTP サーバーと TCP サーバーの 2 つの方法でネットワーク リクエストを処理できます。前者は Web アプリケーションにより適しており、後者はさまざまなカスタム ネットワーク アプリケーションおよびプロトコルに使用されます。この記事では、HTTP サーバーを使用して大きなファイルのアップロード シナリオを実装します。 Swoole には、swoole_http_request と swoole_http_response という 2 つの組み込みオブジェクトが用意されており、これらのオブジェクトを通じて HTTP リクエストと応答に関する情報を取得できます。

  1. 具体的な実装

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. 注意事項

  1. PHP 拡張機能の開始

Swoole を使用するには、対応する PHP 拡張機能を開始する必要があり、次のコマンドでインストールできます。

pecl install swoole
  1. Swoole サーバーの構成

Swoole を使用してファイルをアップロードする場合、Swoole サーバーの関連パラメーターを構成する必要があります。たとえば、ワーカープロセスの数、ログ情報の記録レベル、ポート番号などを設定する必要があり、ニーズに応じて設定できます。上記のサンプル コードでは、構成に次のコードを使用しました。

$http = new SwooleHttpServer("127.0.0.1", 9501);
  1. メモリ使用量

ファイルをアップロードするとき、アップロードされたデータはキャッシュされて処理される必要があります。したがって、ファイルのアップロードを処理するときに大量のメモリが使用される可能性があります。メモリ オーバーフローの問題を回避するには、ファイルをチャンクに分けて読み取り、読み取り後に各データを送信し、送信の完了後に次のデータを読み取ることを検討できます。

5. 概要

この記事では、Swoole を使用して大きなファイルの同時アップロードを実現する方法を紹介します。従来のファイルアップロード方法と比較して、Swooleを使用するとファイルアップロードの効率が大幅に向上し、サーバーのパフォーマンスが向上します。実際のアプリケーションでは、特定のニーズに応じて、適切なアップロード スキームと Swoole パラメーター構成を選択できます。

以上がSwoole は、同時実行性の高い大規模ファイルのアップロード ソリューションを実装していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。