ホームページ  >  記事  >  PHPフレームワーク  >  Swoole の動作: キャッシュ操作にコルーチンを使用する方法

Swoole の動作: キャッシュ操作にコルーチンを使用する方法

PHPz
PHPzオリジナル
2023-11-07 15:00:171359ブラウズ

Swoole の動作: キャッシュ操作にコルーチンを使用する方法

Swooleは、高性能な非同期ネットワークフレームワークとして、近年開発者に好まれ、さまざまな分野で広く利用されています。コルーチンは、Swoole を使用する上で非常に重要な概念の 1 つであり、これにより、同期的な方法で非同期コードを作成できるようになります。この記事では、Swoole でのキャッシュ操作にコルーチンを使用する方法を紹介し、実用的なコード例を示します。

1. コルーチンとは何ですか?

コルーチンはユーザー モードの軽量スレッドであり、プログラマによってコードを通じて管理され、システム スレッドの消費や切り替えが回避されます。 Swoole では、コルーチンを使用して、データベース接続や Redis 操作など、I/O 集中型のネットワーク操作の問題を解決できます。コルーチンは、I/O 操作が発生したときに積極的に制御を放棄し、操作の完了後に実行を再開できます。

2. Swoole のコルーチン サポート

Swoole はバージョン 1.8.0 からコルーチン サポートを導入し、コルーチン、go、defer、channel などのコルーチン スケジューリングを実装するための一連の API を提供します。

1. コルーチン

コルーチンはコルーチンの基本的な操作であり、関数をコルーチンに変換できます。たとえば:

function test()
{
    echo "start
";
    Coroutine::sleep(1);
    echo "end
";
}

Coroutine::create('test');
echo "hello
";

この例では、次のように変換します。テスト関数をコルーチンに組み込み、Coroutine::create() を使用してコルーチンを作成します。コルーチンでは、Coroutine::sleep() を使用して I/O 操作をシミュレートします。この操作により、コルーチンは 1 秒間一時停止し、その後再開され、「end」を出力し続けます。最後に、「hello」が出力されます。これは、コルーチンの非同期の性質を示しています。

2. go

go は、関数をコルーチンとして実行できる特別な関数です (例:

go(function(){
    echo "hello
";
    Coroutine::sleep(1);
    echo "world
";
});
echo "start
";

)。この例では、 go() を使用します。匿名関数を実行します。関数では、「hello」を出力し、1秒間停止し、「world」を順番に出力します。最後に、「start」が出力されます。これは、コルーチンを使用してこの関数を同時に実行していることを証明しています。

3. defer

#defer を使用すると、データベース接続の終了、リソースの解放など、コルーチンの最後でクリーンアップ作業を実行できます。 #

go(function(){
    $db = new Redis();
    $db->connect('127.0.0.1', 6379);
    defer(function() use ($db) {
        $db->close();
    });

    $db->set('key', 'value');
    Coroutine::sleep(1);
    $value = $db->get('key');
    echo $value."
";
});

この例では、defer を使用してコルーチンの最後に Redis 接続を閉じます。 defer を使用しない場合、コルーチンの終了時に接続を閉じるのを忘れて、接続数がリークする可能性があります。

4、channel

channel は Swoole によって提供されるパイプのようなメカニズムで、複数のコルーチン間の通信を可能にします。たとえば、次のようになります。

$chan = new CoroutineChannel(1);

go(function() use($chan) {
    $data = Coroutine::getuid();
    $chan->push($data);
});

$data = $chan->pop();
echo $data."
";

この例では、次のようにします。容量 1 のチャネルを作成し、コルーチンのチャネルにデータをプッシュし、別のコルーチンのチャネルにデータをポップして出力します。チャネルを使用すると、コルーチン間でデータを転送し、共同タスク処理を完了できます。

3. コルーチン操作のキャッシュ

実際の開発において、キャッシュは非常に重要なコンポーネントであり、データベースの負荷を軽減し、キャッシュ ヒットによるデータの読み取り速度を向上させることができます。 Swoole では、Redis などのインメモリ データベースを使用してキャッシュを実装すると同時に、コルーチンを使用してキャッシュの同時実行パフォーマンスを向上させることができます。

1. Redis への接続

Swoole のコルーチン Redis クライアントを使用して Redis データベースに接続し、同時に操作します。コードは次のとおりです:

$redis = new SwooleCoroutineRedis();
$redis->connect('127.0.0.1', 6379);

go(function () use ($redis) {
    $redis->set('name', 'Bob');
    $name = $redis->get('name');
    echo "name=$name
";
});

go(function () use ($redis) {
    $redis->set('age', 18);
    $age = $redis->get('age');
    echo "age=$age
";
});

SwooleCoroutine::sleep(1);

この例では、 Swoole のコルーチン Redis クライアントを使用して Redis データベースに接続しました。次に、コルーチンの形式で読み取りおよび書き込み操作を実行し、コルーチン内で関連する結果を出力しました。最後に、SwooleCoroutine::sleep() を使用して一定時間待機し、コルーチンが完了したことを確認します。同様の方法で、他のインメモリ データベースに接続して操作できます。

2. キャッシュ操作

Redis に接続した後、一連のキャッシュ コマンドを使用して操作できます。たとえば、キャッシュ データを設定するには、set() メソッドを使用できます。

$redis->set('key', 'value');

ここで、「key」はキャッシュ データのキー、「value」はキャッシュ データの値です。キャッシュされたデータを読み取るには、get() メソッドを使用できます。

$value = $redis->get('key');

コルーチンでは、上記のコマンドを使用して同時に操作できます。例:

go(function() use($redis){
    $redis->set('key1', 'value1');
    $value1 = $redis->get('key1');
    echo "key1=$value1
";
});

go(function() use($redis){
    $redis->set('key2', 'value2');
    $value2 = $redis->get('key2');
    echo "key2=$value2
";
});

SwooleCoroutine::sleep(1);

この例では、2 つのコルーチンで 2 つのキャッシュされたデータをそれぞれ設定および読み取り、操作を同時に実行します。これは、コルーチンがキャッシュされたデータの同時実行パフォーマンスを向上できることを証明しています。

3. 操作キャッシュと MySQL

実際のアプリケーションでは、通常、操作のためにキャッシュと MySQL を組み合わせる必要があります。たとえば、最初にキャッシュからデータを読み取ります。キャッシュが存在しない場合は、次にキャッシュからデータを読み取り、MySQL に読み取ります。 Swoole のコルーチン開発では、次のようなメソッドを使用してこの操作を実装できます:

$redis = new SwooleCoroutineRedis();
$redis->connect('127.0.0.1', 6379);

$mysql = new SwooleCoroutineMySQL();
$mysql->connect([
    'host' => '127.0.0.1',
    'port' => 3306,
    'user' => 'root',
    'password' => '123456',
    'database' => 'test',
]);

go(function() use($redis, $mysql) {
    $name = $redis->get('name');
    if($name === false) {
        $result = $mysql->query('select * from user where id=1');
        if(!empty($result)) {
            $name = $result[0]['name'];
            $redis->set('name', $name);
        }
    }
    echo "name=$name
";
});

go(function() use($redis, $mysql) {
    $age = $redis->get('age');
    if($age === false) {
        $result = $mysql->query('select * from user where id=1');
        if(!empty($result)) {
            $age = $result[0]['age'];
            $redis->set('age', $age);
        }
    }
    echo "age=$age
";
});

SwooleCoroutine::sleep(1);

この例では、コルーチン操作メソッドを使用し、最初にキャッシュからの読み取りを試みます。そうでない場合はデータを取得します。キャッシュ内で、MySQL からデータを読み取ります。 MySQL を操作するときは、スレッドのブロックを回避して効率を向上させるためにコルーチンも使用します。最後に、この演算方法が正しいことを証明するために、読み取り結果を印刷しました。

上記は Swoole でのキャッシュ操作にコルーチンを使用する具体的な実装方法ですが、コルーチンを使用するとキャッシュ操作の効率や同時実行性能が向上し、MySQL などの他の操作と組み合わせることができます。実際の開発では、上記の方法で練習し、実際の状況に応じて調整や変更を加えることができます。

以上がSwoole の動作: キャッシュ操作にコルーチンを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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