Последние несколько лет на рынке, по моему сугубо личному мнению, golang вытесняет PHP с рынка, а многие компании считают, что проекты, которые сейчас написаны и работают на PHP должны быть переписаны на golang, чтобы было хорошо.
Такой подход только частично является правдой. На самом деле каждый язык программирования предназначен на решение определенного вида задач, а вопросы производительности в основном зависят очень сильно от разработчика, а не от языка программирования.
Видя это несправедливое отношение PHP, хочу опубликовать ряд статей, в котором рассказывать об особенностях разработки, проблемах, которые нужно учитывать, а также участников разработки, которых также часто забывают, например, devops‑инженеров.
Перед тем, как начать писать статью, я проверил одну теорию, что golang быстрее и производительней PHP. Для этого я взял простую функцию — преобразование строки в json.
Программа на golang
func main() {
// var data []byte
// var err error
data, err := os.ReadFile("test.json")
if err != nil {
log.Fatalln("Error reading file ", err)
return
}
start := makeTimestamp()
wg := &sync.WaitGroup{}
for i := 0; i < 1000000000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
var test *Test
err = json.Unmarshal(data, &test)
if err != nil {
fmt.Println("Error reading file ", err)
return
}
}()
}
wg.Wait()
end := makeTimestamp()
fmt.Printf("%.3fms n", (end-start)/1e9)
}
Программа на PHP
<?php
$start = microtime(true);
SwooleCoroutinerun(function () {
$cnt = 1_000_000_000;
$wg = new SwooleCoroutineWaitGroup();
$fp = fopen(__DIR__ . '/test.json', 'rb');
if ($fp === false) {
echo 'Error' . PHP_EOL;
return;
}
defer(function() use($fp) {
fclose($fp);
});
$result = '';
while ($line = fread($fp, 1024)) {
$result .= $line;
}
for ($i = 0; $i < $cnt; $i++) {
$wg->add();
SwooleCoroutine::create(function () use ($wg, $i, $result) {
$decoded = json_decode($result);
unset($decoded);
$wg->done();
});
}
$wg->wait();
});
$end = microtime(true);
file_put_contents('php://stdout', sprintf("%.3fms n", ($end - $start)));
В результате выполнения этих команд получил:
Golang скомпилированный под локальную машину выполнял команду — 452.430ms
PHP в docker‑образе выполнял команду — 390.859ms
Согласен, что этот пример не доказывает, что PHP быстрее чем Golang, но при этом, он развеивает миф, что golang однозначно лучше PHP.
Также провел замеры при работе http сервера и PHP показал себя с хорошей стороны, в docker‑образе, с подключением к базе данных, вставкой строки в базу и последующим селектом данных и базы и передачей json ответа http сервер на php выдержал 10.000 rps, со средним временем ответа 40мс, максимальным 500мс и минимальным 200 микросекунд, но об этом более детально напишу в следующих статьях.
Какая конечная цель будущего цикла статей:
-
Показать, что PHP хороший язык программирования, на котором можно делать web-проекты
-
Поделиться практиками разработки приложений, на что стоит обратить внимание и какие инструменты выбирать
-
Создать тестовое приложение, на котором можно будет посмотреть на один из вариантов организации работы в команде, чтобы каждому участнику команды (а для меня это: backend-разработчик, frontend-разработчик, devops-инженер, qa-инженер, бизнес/системный-аналитик и product-owner/manager, архитектор)
-
Показать пример unit-экономики, разделения продуктовых фич, расчета стоимости разработки и содержания проекта на разных языках программирования. (Опираться буду на PHP и Golang)
Следующая статья — какие варианты PHP‑сервера существуют, что нужно о них знать разработчику.
Статьи планирую публиковать по воскресеньям. От Вас, уважаемые читатели Хабра, было бы здорово получить обратную связь, интересно ли вам это направление, в комментариях.
Автор: Сергей