Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menangani baris gilir mesej dan komunikasi tak segerak dalam pembangunan PHP

Bagaimana untuk menangani baris gilir mesej dan komunikasi tak segerak dalam pembangunan PHP

WBOY
WBOYasal
2023-10-08 17:18:36989semak imbas

Bagaimana untuk menangani baris gilir mesej dan komunikasi tak segerak dalam pembangunan PHP

Cara menangani baris gilir mesej dan komunikasi tak segerak dalam pembangunan PHP

Pengenalan:
Baris gilir mesej dan komunikasi tak segerak telah menjadi semakin biasa dalam pembangunan perisian moden. Mereka boleh meningkatkan keselarasan dan toleransi kesalahan sistem dan mencapai penyahgandingan tugas dan penyahgandingan perniagaan. Artikel ini akan memperkenalkan cara mengendalikan baris gilir mesej dan komunikasi tak segerak dalam pembangunan PHP, dan menyediakan contoh kod khusus.

1. Apakah itu baris gilir mesej?
Baris gilir mesej ialah model komunikasi yang cekap digunakan untuk penyahgandingan dan penyahgandingan antara komponen yang berbeza. Pengeluar mesej menghantar mesej ke baris gilir mesej, dan pengguna mesej mendapat mesej daripada baris gilir dan memprosesnya. Baris gilir mesej boleh memastikan penghantaran mesej yang boleh dipercayai dan melaksanakan pemprosesan mesej yang berurutan.

Dalam pembangunan PHP, sambungan atau perpustakaan pihak ketiga boleh digunakan untuk melaksanakan fungsi baris gilir mesej. Contohnya, anda boleh menggunakan perkhidmatan baris gilir mesej seperti RabbitMQ, Kafka atau Redis. Berikut ialah contoh penggunaan RabbitMQ untuk melaksanakan baris gilir mesej:

<?php
// 创建RabbitMQ连接
$connection = new AMQPConnection([
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
]);
$connection->connect();

// 创建一个channel
$channel = new AMQPChannel($connection);

// 创建一个exchange
$exchange = new AMQPExchange($channel);
$exchange->setName('exchange_name');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();

// 创建一个queue
$queue = new AMQPQueue($channel);
$queue->setName('queue_name');
$queue->declare();

// 绑定exchange和queue
$queue->bind('exchange_name', 'routing_key');

// 发送消息
$exchange->publish('message', 'routing_key');

// 关闭连接
$connection->disconnect();

2. Kaedah pelaksanaan komunikasi tak segerak
Komunikasi tak segerak boleh meningkatkan keupayaan konkurensi sistem, membolehkan pengguna melakukan operasi lain semasa masa menunggu. Dalam pembangunan PHP, terdapat banyak cara untuk melaksanakan komunikasi tak segerak, seperti menggunakan berbilang benang, berbilang proses, coroutine, dll. Berikut ialah contoh penggunaan coroutine untuk melaksanakan komunikasi tak segerak:

<?php
use SwooleCoroutine;

// 创建协程
Coroutineun(function () {
    // 创建一个http客户端
    $cli = new CoroutineHttpClient('127.0.0.1', 80);

    // 发起异步请求
    $cli->set(['timeout' => 1]);
    $cli->get('/api');

    // 接收响应
    $response = $cli->recv();

    // 处理响应
    if ($response->statusCode == 200) {
        echo $response->body;
    } else {
        echo "request fail";
    }

    // 关闭客户端
    $cli->close();
});

Contoh di atas menggunakan fungsi coroutine dalam sambungan Swoole, yang boleh mensimulasikan kesan berbilang benang dan mencapai komunikasi tak segerak. Permintaan berbilang boleh diproses secara serentak dalam coroutine tanpa menunggu respons permintaan sebelumnya.

3. Aplikasi gabungan baris gilir mesej dan komunikasi tak segerak
Baris gilir mesej dan komunikasi tak segerak boleh digabungkan antara satu sama lain untuk menyediakan fungsi dan prestasi yang lebih berkuasa. Sebagai contoh, baris gilir mesej boleh digunakan untuk mengendalikan tugas yang memakan masa, manakala komunikasi tak segerak boleh menolak data masa nyata.

Berikut ialah contoh aplikasi yang menggabungkan baris gilir mesej dan komunikasi tak segerak:

<?php
use SwooleCoroutine;

// 创建协程
Coroutineun(function () {
    // 创建RabbitMQ连接
    $connection = new AMQPConnection([...]);
    $connection->connect();

    // 创建一个channel
    $channel = new AMQPChannel($connection);

    // 创建一个exchange和queue
    $exchange = new AMQPExchange($channel);
    $exchange->setName('exchange_name');
    $exchange->setType(AMQP_EX_TYPE_DIRECT);
    $exchange->declare();

    $queue = new AMQPQueue($channel);
    $queue->setName('queue_name');
    $queue->declare();
    $queue->bind('exchange_name', 'routing_key');

    // 监听消息
    Coroutine::create(function () use ($queue) {
        while (true) {
            $envelope = $queue->get();
            if ($envelope) {
                $message = $envelope->getBody();

                // 处理消息
                // ...

                // 发送异步通知
                $cli = new CoroutineHttpClient('127.0.0.1', 80);
                $cli->set(['timeout' => 1]);
                $cli->post('/notify', ['message' => $message]);
                $response = $cli->recv();

                // 关闭客户端
                $cli->close();

                // 确认消息处理完成
                $queue->ack($envelope->getDeliveryTag());
            } else {
                Coroutine::sleep(1);
            }
        }
    });

    // 发送消息
    $exchange->publish('message', 'routing_key');

    // 关闭RabbitMQ连接
    $connection->disconnect();
});

Contoh di atas menggunakan RabbitMQ untuk melaksanakan baris gilir mesej dalam coroutine, dan menggunakan kaedah komunikasi tak segerak coroutine semasa proses pemprosesan mesej.

Kesimpulan:
Baris gilir mesej dan komunikasi tak segerak merupakan teknologi yang amat diperlukan dalam pembangunan perisian moden. Dalam pembangunan PHP, anda boleh menggunakan sambungan atau perpustakaan pihak ketiga untuk melaksanakan fungsi baris gilir mesej, dan menggunakan coroutine dan kaedah lain untuk melaksanakan komunikasi tak segerak. Dengan menggunakan kedua-dua ini secara rasional, keselarasan dan toleransi kesalahan sistem boleh dipertingkatkan, dan penyahgandingan tugas dan penyahgandingan perniagaan boleh dicapai.

Rujukan:

  1. Dokumentasi rasmi RabbitMQ: https://www.rabbitmq.com/documentation.html
  2. Dokumentasi rasmi Swoole: https://www.swoole.co.uk/docs/

Atas ialah kandungan terperinci Bagaimana untuk menangani baris gilir mesej dan komunikasi tak segerak dalam pembangunan PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn