jakubkulhan / bunny

Performant pure-PHP AMQP (RabbitMQ) sync/async (ReactPHP) library
MIT License
698 stars 101 forks source link

Rebuild into async only with sync API #147

Closed WyriHaximus closed 4 months ago

WyriHaximus commented 7 months ago

Non-Breaking Changes:

Breaking changes:

-use Bunny\Async\Client; +use Bunny\Client; -use React\EventLoop\Factory;

require dirname(DIR, 2) . '/vendor/autoload.php';

-$loop = Factory::create();

-(new Client($loop))->connect(); +$client = new Client();

-$loop->run();


* Merged `Async` and `Sync` clients into `Client` utilizing fibers through [`react/async`](https://reactphp.org/async/)

### Sync

`receive.php`:
```diff
<?php

use Bunny\Channel;
use Bunny\Client;
use Bunny\Message;

require dirname(__DIR__, 2) . '/vendor/autoload.php';

-$client = (new Client())->connect();
+$client = new Client();
$channel = $client->channel();

$channel->queueDeclare('hello', false, false, false, false);

echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

-$channel->run(
+$channel->consume(
    function (Message $message, Channel $channel) {
        echo " [x] Received ", $message->content, "\n";
    },
    'hello',
    '',
    false,
    true,
);

send.php:

<?php

use Bunny\Client;

require dirname(__DIR__, 2) . '/vendor/autoload.php';

-$client = (new Client())->connect();
+$client = new Client();
$channel = $client->channel();
$channel->queueDeclare('hello', false, false, false, false);
$channel->close();

$channel->publish('Hello World!', [], '', 'hello');
echo " [x] Sent 'Hello World!'\n";

$channel->close();
$client->disconnect();

Async

receive-async.php:

<?php

use Bunny\Channel;
-use Bunny\Async\Client;
+use Bunny\Client;
use Bunny\Message;
-use React\EventLoop\Factory;

require dirname(__DIR__, 2) . '/vendor/autoload.php';

-$loop = Factory::create();

-(new Client($loop))->connect()
+$client = new Client();
-->then(function (Client $client) {
-    return $client->channel();
-})
+$channel = $client->channel();

-->then(function (Channel $channel) {
-    return $channel->queueDeclare('hello', false, false, false, false)->then(function () use ($channel) {
-        return $channel;
-    });
-})
+$channel->queueDeclare('hello', false, false, false, false);

-->then(function (Channel $channel) {
-    echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
-    $channel->consume(
-        function (Message $message, Channel $channel, Client $client) {
-            echo " [x] Received ", $message->content, "\n";
-        },
-        'hello',
-        '',
-        false,
-        true
-    );
-});
+echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

+$channel->consume(
+    function (Message $message, Channel $channel) {
+        echo " [x] Received ", $message->content, "\n";
+    },
+    'hello',
+    '',
+    false,
+    true,
+);

-$loop->run();

send-async.php:

<?php

-use Bunny\Channel;
-use Bunny\Async\Client;
+use Bunny\Client;
-use React\EventLoop\Factory;

require dirname(__DIR__, 2) . '/vendor/autoload.php';

-$loop = Factory::create(); 

-(new Client($loop))->connect()
+$client = new Client();

-->then(function (Client $client) { 
-    return $client->channel(); 
-})
+$channel = $client->channel();

-->then(function (Channel $channel) {   
-    return $channel->queueDeclare('hello', false, false, false, false)->then(function () use ($channel) {  
-        return $channel;   
-    });    
-})
+$channel->queueDeclare('hello', false, false, false, false);

-->then(function (Channel $channel) {   
-    echo " [x] Sending 'Hello World!'\n";  
-    return $channel->publish('Hello World!', [], '', 'hello')->then(function () use ($channel) {   
-        return $channel;   
-    });    
-})
+$channel->publish('Hello World!', [], '', 'hello');

-->then(function (Channel $channel) {   
-    echo " [x] Sent 'Hello World!'\n"; 
-    $client = $channel->getClient();   
-    return $channel->close()->then(function () use ($client) { 
-        return $client;    
-    });    
-})
+echo " [x] Sent 'Hello World!'\n";
+$channel->close();

-->then(function (Client $client) { 
-    $client->disconnect(); 
-});
+$client->disconnect();

use Bunny\Channel; use Bunny\Client; use Bunny\Message;

require dirname(DIR, 2) . '/vendor/autoload.php';

$client = new Client(); $channel = $client->channel();

$channel->exchangeDeclare('logs', 'fanout'); $queue = $channel->queueDeclare('', false, false, true, false); -$channel->queueBind($queue->queue, 'logs'); +$channel->queueBind('logs', $queue->queue);