PHP 7.1.1 FPM vs Node.js 7.4.0 в якості web backend сервера

Всім привіт, вирішив поділитися з вами результатами синтетичного тесту продуктивності свіжих версій PHP і Node.js.

Конфігурація сервера:

Простий VDS — 1 ядро процесора 2ГГц, 1 гб оперативы, 10Гб SSD.
ОС: Debian 8.6.
Так само зроблені базові налаштування ядра, щоб сервер в принципі міг обробляти велику кількість з'єднань.

Випробовувані:

— PHP 7.1.1 FPM
— Node.js 7.4.0

Перший етап:

Тут операції, які в основному використовує backend. А саме: склеювання рядків, мережевий введення-виведення, арифметика і робота з масивами.

Код Node.js:

var fs = require('fs');
var mysql = require('mysql2');

console.time('Node.js' + process.version + ': склеювання рядків 1000000 раз');
var str = ";
for (var i = 0; i < 1000000; i++) {
str += 's';
}
console.timeEnd('Node.js' + process.version + ': склеювання рядків 1000000 раз');


console.time('Node.js' + process.version + ': додавання чисел 1000000 раз');
var count = 0;
for (var i = 0; i < 1000000; i++) {
count++;
}
console.timeEnd('Node.js' + process.version + ': додавання чисел 1000000 раз');


console.time('Node.js' + process.version + ': наповнення простого масиву 1000000 раз');
var array = [];
for (var i = 0; i < 1000000; i++) {
array.push('s');
}
console.timeEnd('Node.js' + process.version + ': наповнення простого масиву 1000000 раз');


console.time('Node.js' + process.version + ': наповнення асоціативного масиву 1000000 раз');
var array = {};
for (var i = 0; i < 1000000; i++) {
array['s' + i] = 's';
}
console.timeEnd('Node.js' + process.version + ': наповнення асоціативного масиву 1000000 раз');


console.time('Node.js' + process.version + ': читання файлу 100 разів');
var content;
for (var i = 0; i < 100; i++) {
content = fs.readFileSync('./someFile.txt');
}
console.timeEnd('Node.js' + process.version + ': читання файлу 100 разів');


console.time('Node.js' + process.version + ': mysql query (SELECT NOW()) 100 разів');
// create the connection to database
var connection = mysql.createConnection({host:'localhost' user: 'root', database: 'test', password: 'password'});

function promiseQuery(query) {
return new Promise((resolve, reject) => {
connection.query(query, function (err, results, fields) {
resolve({err, results, fields});
});
});
}
for (var i = 0; i < 100; i++) {
var a = promiseQuery('SELECT NOW()');
a.then(({err, results, fields}) => {
//console.log(results);
});
}
console.timeEnd('Node.js' + process.version + ': mysql query (SELECT NOW()) 100 разів');
connection.end();

Код для PHP:

<?php
$phpVersion = "v" . explode('-', PHP_VERSION)[0];


$start = microtime(1);
$str = ";
for ($i = 0; $i < 1000000; $i++) {
$str .= 's';
}

echo "PHP $phpVersion: склеювання рядків 1000000 разів: " . round((microtime(1) - $start) * 1000, 3) . "ms \n";


$start = microtime(1);
$count = 0;
for ($i = 0; $i < 1000000; $i++) {
$count++;
}

echo "PHP $phpVersion: додавання чисел 1000000 разів: " . round((microtime(1) - $start) * 1000, 3) . "ms \n";



$start = microtime(1);
$array = array();
for ($i = 0; $i < 1000000; $i++) {
$array[] = 's';
}

echo "PHP $phpVersion: наповнення простого масиву 1000000 разів: " . round((microtime(1) - $start) * 1000, 3) . "ms \n";


$start = microtime(1);
$array = array();
for ($i = 0; $i < 1000000; $i++) {
$array["s" . $i] = 's';
}

echo "PHP $phpVersion: наповнення асоціативного масиву 1000000 разів: " . round((microtime(1) - $start) * 1000, 3) . "ms \n";


$start = microtime(1);
for ($i = 0; $i < 100; $i++) {
$fp = fopen("./someFile.txt", "r");
$content = fread($fp, filesize("./someFile.txt"));
fclose($fp);
}

echo "PHP $phpVersion: читання файлу 100 разів: " . round((microtime(1) - $start) * 1000, 3) . "ms \n";


$start = microtime(1);
$mysql = new mysqli('localhost', 'root', 'password', 'test');
for ($i = 0; $i < 100; $i++) {
$res = $mysql->query("SELECT NOW() as `now`");
$now = $res->fetch_assoc()['now'];
}

echo "PHP $phpVersion: mysql query (SELECT NOW()) 100 разів: " . round((microtime(1) - $start) * 1000, 3) . "ms \n";

Результати:

image

Як видно, PHP виграє по всіх пунктах, крім операції додавання.

Другий етап:

Навантажувальне тестування «Hello world». Nginx 11.7 + PHP 7.1.1 FPM vs Node.js. 1000 запитів на 1000 потоків. #ab -n 1000 -c 1000…

Код PHP:

<?php
echo "Hello world";
?>

Код Node.js:

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});

server.слухати(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

Результати

Прогнав з 10 тестів для PHP і для Node.js і вибрав кращі результати в обох.

Node.js:

image

PHP:

image

Як бачимо і тут PHP виграє на 23% або на 628 запитів в секунду. Багато це чи мало-судити вам.

Діліться у коментах своїми думками з цього приводу.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.