Workerman は、PHP をベースに開発された高性能な非同期イベント駆動型フレームワークで、TCP/UDP プロトコルでの長時間接続の開発を簡単に実現できます。さらに、Workerman はファイル転送を実現する機能も提供しており、大規模なファイル転送やデータのバックアップなどのシナリオで使用できます。この記事では、Workerman にファイル転送機能を実装する方法と具体的なコード例を紹介します。
1. ファイルアップロード機能の実装
ファイルアップロード機能では、クライアントがアップロードするファイルをサーバーに送信する必要があり、サーバーはファイルを検証して保存します。 Workerman では、workerman/file-transfer コンポーネントを使用してファイル アップロード機能を実装できます。具体的なプロセスは次のとおりです。
$ftp = new Ftp($server_ip, $server_port); $ftp->connect(); $response = $ftp->send($zip_file_path);
ここでは、クライアントによってパッケージ化された zip ファイルをサーバーに送信するために FTP コンポーネントが使用されています。
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() 関数を使用して、ローカル ファイル接続とサーバー側のファイル接続を開き、サーバーから返されたファイル データをローカル ファイルに書き込むことができます。具体的なプロセスは次のとおりです。
$client->send(json_encode([ 'type' => 'download', 'filename' => $filename, ]));
クライアントは、ダウンロードするファイルの名前を含むメッセージをサーバーに送信します。
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 ループを通じてクライアントに複数回送信されます。
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 サイトの他の関連記事を参照してください。