Последние несколько лет на рынке, по моему сугубо личному мнению, 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); \Swoole\Coroutine\run(function () { $cnt = 1_000_000_000; $wg = new \Swoole\Coroutine\WaitGroup(); $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(); \Swoole\Coroutine::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‑сервера существуют, что нужно о них знать разработчику.
Статьи планирую публиковать по воскресеньям. От Вас, уважаемые читатели Хабра, было бы здорово получить обратную связь, интересно ли вам это направление, в комментариях.
