HTTP tests were performed using ApacheBench Version 2.3, WebSocket tests were performed using Google Chrome 64.0.3282.140 64-bit. PHP version was 7.2 on AMD Ryzen 7 1700 @ 3.8 GHz. Each test was repeated 3 times and the average result was taken.

HTTP tests

Software No. of req Concurrency Req/sec
Node JS 100000 50 21456
ReactPHP 100000 50 6981
Psockets 100000 50 30466

Node JS code


var http = require('http');                                                                                                                                                                                                                                                    
var url = require('url');                                                                                                                                                                                                                                                      
var server;                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                               
server = http.createServer(function (req, res) {                                                                                                                                                                                                                               
  var urlParts = url.parse(req.url, true);                                                                                                                                                                                                                                     
  var query = urlParts.query;                                                                                                                                                                                                                                                  
  var result = parseInt(query.a) + parseInt(query.b);                                                                                                                                                                                                                          
  res.end(result.toString());                                                                                                                                                                                                                                                  
});                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                               
server.listen(9999);
        

ReactPHP code


use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Response;
use React\Http\Server;

require __DIR__ . '/../vendor/autoload.php';

$loop = Factory::create();

$server = new Server(function (ServerRequestInterface $request) {
    $params = $request->getQueryParams();
    $result = (int)$params['a'] + (int)$params['b'];

    return new Response(
        200,
        array(
            'Content-Type' => 'text/plain'
        ),
        "$result\n"
    );
});

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);

echo 'Listening on ' . str_replace('tcp:', 'http:', $socket->getAddress()) . PHP_EOL;

$loop->run();
        

Psockets code


class Adder extends HttpComponent {                                                                                                                                                                                                                                            
    public static $PATH = '/';                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                               
    public function onRequest($con, $request, $response) {                                                                                                                                                                                                                                
        $query = $request->getQuery();                                                                                                                                                                                                                                         
        $result = ((int)$query['a'] ?? 0) + ((int)$query['b'] ?? 0);                                                                                                                                                                                                           
        $response->write($result);                                                                                                                                                                                                                       
        return true;                                                                                                                                                                                                                                                           
    }                                                                                                                                                                                                                                                                          
} 
        

WebSocket tests

For this test I measured the time needed to open 100 connections, send a message to the server and get the response.

Software No. of req Sec
Node JS 100 4.996
Psockets 100 5.025

Node JS code


const WebSocket = require('ws');

const ws = new WebSocket.Server({
  port: 8080,
  handleProtocols: function(protocol, req) {
    if (protocol == 'echo') {
      return protocol;
    } else {
      return false;
    }
  }
});

ws.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    ws.send(message);
  });
});
        

Psockets code


class SimpleEcho extends WebSocketComponent {
    public static $PROTOCOL = "echo";

    public function onLoad($ip, $port, $host) {
        $this->server->log->debug("SimpleEcho component loaded on $ip:$port for host $host");
    }

    public function onMessage($con, $data, $dataType = 'text') {
        $con->send($data);
    }
}