PHP

Integrating a ReactPHP Server in Laravel

Integrate Laravel in ReactPHP

Create a Command

Create a Laravel command,

php artisan make:command SaleServer --command=bidserver:sale

This command will be a daemon that runs a ReactPHP server.

Calling the Server

The command is called with a HTTP post from a Livewire component,

Http::asForm()->post(config('auctions.SALE_SERVER_URL') . ':' 
    .  config('auctions.SALE_SERVER_PORT') . '/buy', 
    [
        'auction_id' => $this->auction->id,
        'item_id' => $this->item->id,
        'user' => $this->user->id,
        'price' => $bid_received['price'],
    ]
);   

The Server

The command creates a ReactPHP server, that receives these calls.

<?php

namespace App\Console\Commands;


use Illuminate\Console\Command;
use React\Http\Server;
use React\Http\Message\Response;
use React\EventLoop\Factory;
use Psr\Http\Message\ServerRequestInterface;
use React\Socket\SocketServer;

class SaleServer extends Command
{

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'bidserver:sale';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Sale bid server';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $loop = Factory::create();

        $server = new Server(function (ServerRequestInterface $request) {

            $path = $request->getUri()->getPath();
            $method = $request->getMethod();

            //Check if the path and method of the call are correct
            if ($path == '/buy'  && $method === 'POST') {

                //Extract the call parameters
                $auction_id = $request->getParsedBody()['auction_id'] ?? null;
                $item_id = $request->getParsedBody()['item_id'] ?? null;
                $user = $request->getParsedBody()['user'] ?? null; 
                $bid_price = $request->getParsedBody()['price'] ?? null; 

                //Broadcast a response
                broadcast(new BuyAccepted($auction_id, $item_id, $user))->toOthers();

                return Response::plaintext('bid processed')->withStatus(Response::STATUS_OK);   

            }             

            return Response::plaintext('Not found')->withStatus(Response::STATUS_NOT_FOUND);

        });

        $socket = new SocketServer('0.0.0.0:' . config('auctions.SALE_SERVER_PORT'));
        $server->listen($socket);

        $loop->run();

    }
}

Daemon in Forge

Add a daemon running the command:

php artisan bidserver:sale

Yoram Kornatzky

Yoram Kornatzky