ホームページ  >  記事  >  PHPフレームワーク  >  Swoole で高い同時ファイルアップロードを実現する方法

Swoole で高い同時ファイルアップロードを実現する方法

王林
王林オリジナル
2023-06-25 18:21:15916ブラウズ

インターネットの急速な発展に伴い、さまざまな種類の Web サイトやアプリケーションが誕生し続けていますが、その中でもファイルのアップロードは非常に重要な機能です。同時実行性が高い場合、ファイルのアップロードがサーバーのボトルネックになることがよくあります。

Swoole は、高効率、安定性、非同期性、並列性などの特徴を備えた PHP ネットワーク通信フレームワークであり、高同時実行性および高性能ネットワーク サーバーで広く使用されています。この記事では、Swoole で同時ファイルアップロードを実現する方法を紹介します。

1. 従来のファイル アップロード方法

従来のファイル アップロード方法は、HTTP プロトコルを通じて実装されます。クライアントがファイルをアップロードすると、ブラウザはそのファイルを含む HTTP リクエストをサーバーに送信し、サーバーがリクエストを受信すると、ファイルを処理して指定された場所に保存します。

この方法にはいくつかの問題があります。

  1. HTTP プロトコルは TCP プロトコルに基づいており、ハンドシェイク、解凍、エラー チェックが行われるため、ファイルのアップロード速度が遅くなります。他の操作の場合、これらの操作はアップロード速度に影響します。
  2. 同時実行性が高い場合、各 HTTP リクエストにはサーバー リソースが必要であり、同時に大きなファイルをアップロードすると大量のメモリが消費されるため、サーバーはボトルネックになりやすくなります。
  3. ファイル転送中に暗号化と検証のメカニズムがなく、セキュリティは比較的低いです。

2. Swoole を使用してファイルの同時アップロードを実現します

  1. Swoole の HTTP サーバーを使用します

Swoole は高性能 HTTP サーバーを提供します、従来の HTTP サーバーの代わりに使用できます。 Swoole の HTTP サーバーを使用すると、アップロードと処理を分離できるため、ファイルのアップロードの同時実行性が向上し、ファイル データがメモリに保存され、ファイルの読み取りと書き込みの時間を節約できます。

以下は基本的な Swoole HTTP サーバー コードです:

$server = new swoole_http_server("0.0.0.0", 9501);

$server->on('request', function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello World
");
});

$server->start();
  1. Swoole の非同期アップロードの使用

Swoole の非同期アップロード方法を使用すると、ファイルのアップロード速度を大幅に向上させることができます。従来のファイル アップロード方法では、同期 IO が使用されます。アップロードするたびに、アップロードを続行する前に、ファイルの読み取りまたは書き込みが完了するまで待つ必要があります。非同期アップロードでは、ファイルの読み取りまたは書き込みタスクが Swoole の非同期タスクの実行に転送されます。ファイルの読み取りまたは書き込みが行われ、アップロード速度が向上します。

以下は Swoole の非同期アップロード コードです:

$server->on('request', function ($request, $response) use ($server) {
    if ($request->server['request_uri'] == '/upload') {
        $fileName = $request->files['file']['name'];

        $tmpName = $request->files['file']['tmp_name'];

        $fileData = [
            'mode' => 'a',
            'data' => '',
            'offset' => 0,
            'file' => null,
            'fd' => null,
        ];

        $fileData['fd'] = fopen($fileName, $fileData['mode']);
        $fileData['file'] = swoole_async_read($tmpName, function($filename, $content) use ($fileData, $request, $response) {
            $fileData['data'] .= $content;
            $fileData['offset'] += strlen($content);
            if ($fileData['offset'] == $request->header['content-length']) {
                fwrite($fileData['fd'], $fileData['data']);
                fclose($fileData['fd']);
                $response->end('Upload success');
            }
        });
    }
});
  1. Swoole のコルーチン アップロードを使用する

Swoole のコルーチン アップロードを使用すると、ファイルのアップロードをより簡単に実装できます。コルーチン アップロードを使用する場合、Swoole が提供するコルーチン メカニズムを使用してファイルの読み取りタスクと書き込みタスクを非同期にすることができ、これによりファイルのアップロード速度が向上します。

以下は Swoole のコルーチン アップロード コードです:

$server->on('request', function ($request, $response) use ($server) {
    if ($request->server['request_uri'] == '/upload') {
        $fileName = $request->files['file']['name'];
        $tmpName = $request->files['file']['tmp_name'];
 
        $content = file_get_contents($tmpName);
        go(function() use ($fileName, $content, $response) {
            file_put_contents($fileName, $content);
            $response->end('Upload success');
        });
    }
});

概要:

同時実行性が高い場合、ファイルのアップロードがサーバーのボトルネックになることがよくあります。 , アップロード方式では、アップロード速度が遅い、セキュリティが低い、サーバーがボトルネックになるなどの問題が発生しやすいです。 Swoole を使用すると、非同期アップロードとコルーチン アップロードを使用できるため、ファイルのアップロード速度が大幅に向上し、サーバーの同時実行パフォーマンスとセキュリティも向上します。

以上がSwoole で高い同時ファイルアップロードを実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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