ホームページ  >  記事  >  PHPフレームワーク  >  Workermanドキュメントにファイル転送機能を実装する

Workermanドキュメントにファイル転送機能を実装する

王林
王林オリジナル
2023-11-08 15:39:161270ブラウズ

Workermanドキュメントにファイル転送機能を実装する

Workerman は、PHP をベースに開発された高性能な非同期イベント駆動型フレームワークで、TCP/UDP プロトコルでの長時間接続の開発を簡単に実現できます。さらに、Workerman はファイル転送を実現する機能も提供しており、大規模なファイル転送やデータのバックアップなどのシナリオで使用できます。この記事では、Workerman にファイル転送機能を実装する方法と具体的なコード例を紹介します。

1. ファイルアップロード機能の実装

ファイルアップロード機能では、クライアントがアップロードするファイルをサーバーに送信する必要があり、サーバーはファイルを検証して保存します。 Workerman では、workerman/file-transfer コンポーネントを使用してファイル アップロード機能を実装できます。具体的なプロセスは次のとおりです。

  1. クライアントはファイルを zip ファイルにパッケージ化し、サーバーに送信します。
$ftp = new Ftp($server_ip, $server_port);
$ftp->connect();
$response = $ftp->send($zip_file_path);

ここでは、クライアントによってパッケージ化された zip ファイルをサーバーに送信するために FTP コンポーネントが使用されています。

  1. サーバーはファイル形式を検証し、解凍します。
public static function handle($connection, $data)
{
    $zip_file = 'upload_file.zip';
    file_put_contents($zip_file, $data);
    $zip = new ZipArchive();
    if ($zip->open($zip_file) === TRUE) {
        $zip->extractTo('./unzip_file/');
        $zip->close();
        unlink($zip_file);
    } else {
        $connection->send("unzip failed");
    }
}

サーバーは、workerman/file-transfer コンポーネントを通じてクライアントからファイル データを受信し、zip ファイルとして保存します。次に、ZipArchive ライブラリを使用してファイルを解凍し、解凍されたファイルを指定したディレクトリに保存します。解凍に失敗した場合は、失敗情報がクライアントに送信されます。

2. ファイルダウンロード機能の実装

ファイルダウンロード機能では、クライアントがサーバーにファイルを要求し、サーバーから応答されたファイルデータをローカルファイルとして保存する必要があります。 Workerman では、PHP の fopen() 関数を使用して、ローカル ファイル接続とサーバー側のファイル接続を開き、サーバーから返されたファイル データをローカル ファイルに書き込むことができます。具体的なプロセスは次のとおりです。

  1. クライアントは、サーバーへのファイルのダウンロード要求を開始します。
$client->send(json_encode([
    'type' => 'download',
    'filename' => $filename,
]));

クライアントは、ダウンロードするファイルの名前を含むメッセージをサーバーに送信します。

  1. サーバーはクライアントのリクエストを受信し、ファイル データをストリーミング形式で送信します。
public static function handle($connection, $data)
{
    $data = json_decode($data, true);
    $filename = $data['filename'];
    if (!file_exists($filename)) {
        $connection->send(json_encode(['code' => -1, 'msg' => 'file not exist']));
        return;
    }
    $fp = fopen($filename, 'rb');
    $total = filesize($filename);
    $connection->send(json_encode(['code' => 0, 'msg' => 'filesize', 'data' => ['size' => $total]]));
    while (!feof($fp)) {
        $connection->send(fread($fp, 8192), true);
    }
    fclose($fp);
}

サーバーはクライアントのリクエストを受信すると、まずファイルが存在するかどうかを判断します。ファイルが存在しない場合は、失敗メッセージがクライアントに返されます。ファイルが存在する場合、fopen() 関数を使用してファイル接続が開かれ、ファイルの合計サイズが計算されます。次に、合計ファイル サイズ情報をクライアントに送信します。その後、ファイルの内容は while ループを通じてクライアントに複数回送信されます。

  1. クライアントはサーバーからファイル データを受信し、ローカル ファイルとして保存します。
public function download($client, $response)
{
    $this->downloadSize = 0;
    $this->downloadTotal = $response['data']['size'];
    $data = json_encode(['type' => 'download_continue']);
    while ($this->downloadSize < $this->downloadTotal) {
        $client->send($data);
    }
    fclose($fp);
}

クライアントは、サーバーから合計ファイル サイズを受信した後、ループを使用してサーバーから送信されたファイル データを受信し、ローカル ファイルとして保存します。

要約すると、workerman/ファイル転送コンポーネントと PHP の fopen() 関数を使用することで、Workerman にファイルのアップロードおよびダウンロード機能を簡単に実装できます。大きなファイルをアップロードする場合、ユーザーエクスペリエンスを向上させるために、アップロード進行状況バーや分割送信などの機能を追加する必要があることに注意してください。

以上がWorkermanドキュメントにファイル転送機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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