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." "; });
$chan = new CoroutineChannel(1); go(function() use($chan) { $data = Coroutine::getuid(); $chan->push($data); }); $data = $chan->pop(); echo $data." ";
$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);
$redis->set('key', 'value');
$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);
$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);
上記は Swoole でのキャッシュ操作にコルーチンを使用する具体的な実装方法ですが、コルーチンを使用するとキャッシュ操作の効率や同時実行性能が向上し、MySQL などの他の操作と組み合わせることができます。実際の開発では、上記の方法で練習し、実際の状況に応じて調整や変更を加えることができます。
以上がSwoole の動作: キャッシュ操作にコルーチンを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。