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.
| 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;
}
}
| 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);
}
}