Pull to refresh

PHP vs Node.js

Reading time15 min
Views129K
Это перевод статьи Крэга Баклера (Craig Buckler) «SitePoint Smackdown: PHP vs Node.js» и судейских решений Бруно Шкворца и Джеймса Хиббарда (Bruno Škvorc, James Hibbard) статьи Крэга Баклера.

От переводчика


Существует много статей на эту тему, с качественными характеристическими анализами и прогнозами производительности. Однако, мне все же хотелось найти такую статью, где профессиональные программисты делятся своими мнениями и пытаются что-то подсказать, предостеречь новичка, который только изучает PHP или NodeJS (cерверный JavaScript). Многие не любят PHP и говорят, что PHP создан, чтобы умирать (да, там есть сборщик мусора, который убивает наши переменные после выполнения скрипта, а не потому что его забросил Расмус Лердорф), однако, что теперь не учить PHP совсем, в то время как на нем работает 80% сайтов в интернете. Поэтому, если мы хотим быть профессионалами и пытаться хоть как-то расширить свой кругозор, нам нужно четко разделять задачи PHP и задачи NodeJS, а не сливать все в кучу.

«10 раундов боксеров разных весовых категорий»


Одним прекрасным днем Крэг Баклэр (Craig Buckler) на сайте SitePoint.com опубликловал сравнительный анализ PHP и NodeJS под названием «10 раундов», чтобы определить кто является абсолютным чемпионом. Однако, в это же время он отметил, что такой анализ является несколько спорным. Поэтому, для некоторого развлечения, он пригласил двух судей, которые внесли бы свою лепту в этот боксерский поединок. Он попросил Бруно Шкворца (Bruno Škvorc, редактор колонки PHP на сайте SitePoint.com) и Джеймса Хиббарда (James Hibbard, редактор колонки JavaScript на сайте SitePoint.com) прокомментировать каждый из раундов, удар за ударом — оценка.

Введение


Web-программирование стремительно развивается, и перед back-end разработчиками встает вопрос выбора между устоявшимися тяжеловесами Java, C, Perl и современными веб-ориентированными языками, такими как, Ruby, Clojure, Go. Ваш выбор имеет огромное значение, накладывая свой отпечаток на работу приложения.

Но какой сделать выбор для веб-разработки?

Не хочеться затевать холивар, но все же мы будем сегодня говорить о PHP и NodeJS:

  • PHP — был создан в 1994 году Расмусом Лердфордом (Rasmus Lerdorf). Он создал программную оболочку (интерпретатор), которая устанавливается в качестве модуля для веб-сервера Apache или Nginx. Изначально разрабатывался как препроцессор гипертекстовых страниц, поэтому PHP может быть легко интегрирован в HTML код, однако, такой подход сейчас не является хорошей практикой, но все же для новичков такой подход был очевиден. Это способствовало популярности языка, поэтому 80% сайтов в интернете написаны на PHP, они же, в частности, работают под управлением WordPress CMS (20% сайтов в интернете).
  • Node.js — был создан в 2009 году Райаном Далем (Ryan Dahl). Он создал программную платформу, основанную на JavaScript движке V8 от Google. Необычно то, что платформа имеет встроенные библиотеки для обработки запросов и ответов, тем самым вам не нужно использовать сторонний веб-сервер и какие-либо другие зависимости. Node.js набирает обороты и он используется такими компаниями, как Microsoft, Yahoo, LinkedIn и PayPal.

Почему не говорим о C#, Java, Ruby, Python, Perl, Erlang, C++, Go, Dart, Scala, Haskell, и других?


Стали бы вы читать статью обо всем и вся, вам нужна энциклопедия? Поэтому мы огранили и сужили круг до двух знаменитых потому, что:

1. PHP и Node.js веб-ориентированны, у обоих открытый исходных код, они направлены, исключительно, на веб-разработку
2. PHP давний язык, однако, Node.js в нашем случае является выскочкой, который набирает обороты по популярности, поэтому php-разработчику стоит задаться вопросом. А стоит ли менять технологию?
3. Многие разработчики программируют с далеких 90х на PHP и JavaScript и переходить на другие языки программирования не все хотят, ибо не отдают им должное.

Правила


Боксер в правом углу — PHP, боксер в левом — Node.js. Абсолютным победителем будет та технология, которая победит по количеству раундов.

Первый раунд: быстрый старт


В этом раунде мы определяем, как быстро мы можем написать «Hello, world» страницу на том или ином языке программирования, в это время мы включаем время потраченное на настройку сервера.

Подготавливаем среду:



1) Как быстро вы можете построить «Hello World» веб-страницу на PHP:

<?php
	echo 'Hello World!';
?>

Этот код может быть написан где угодно, как правило, код пишут в файлах, оканчивающихся на расширение .php. Если вы написали этот код в файле index.php и запустили на локальном сервере через порт 8000 (на своем компьютере, а не на реальном хостинге), то его отображение будет доступно по адресу:

http://localhost:8000
.
Однако, используя готовый интерпретатор PHP со встроенным сервером довольно ненадежное занятие. Лучше использовать готовые решения, сборки Apache — XAMPP или виртуальные OS (Vagrant). Кстати, свой файл вы сможете загрузить на любой хостинг интернета.

2) Установить платформу Node.js проще простого, если вы работаете на unix-подобных системах, вы сможете это сделать и при помощи менеджеров пакетов. Давайте создадим страницу index.js:

const http = require('http');
const hostname = 'localhost';
const port = 8000;

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');
}).listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Мы повторили аналогичные действия, код на JavaScript, как правило, пишут в файлах, оканчивающихся на расширение .js. Если вы написали этот код в файле index.js и запустили на локальном сервере через порт 8000 (на своем компьютере, а не на реальном хостинге), то его отображение также будет доступно по адресу (при условии, что php теперь работает на другом порту):

http://localhost:8000

Теперь давайте оценим код, даже если вы хорошо знаете клиентский JavaScript, вам придется думать и разбираться с тем, что же здесь написано. Вы должны понимать замыкания и callback-функции, промисы, программирование на стороне Node.js требует некоторой сноровки.

PHP концептуально проще и выигрывает этот раунд. Хотя PHP имеет несколько программных зависимостей, однако PHP менее сложный для изучения.

Оценка судей — PHP 1:0 Node.js


  • Бруно: PHP выигрывает из-за низкого порога вхождения. Тут скорее вопрос восприятия. На экране они отображаются одинаково и существенного отличия у них нет. Фактически синтаксис гораздо проще для новичков программирования.
  • Джеймс: При разработке на локальной машине, я не вижу разницы между ними. Чтобы запустить скрипт в браузере, вам необходимо иметь веб-сервер и терминал. Чтобы на Node.js делать что-то серьезное, нужно устанавливать дополнительные модули, например, express (фреймворк для веб-приложений). Однако, концептуально PHP — проще.

Второй раунд: помощь и поддержка


На самом деле вы никуда не уедете на своих знаниях без изучения каких-либо курсов, современных практик, чтобы развиваться, вам нужно задавать вопросы на форумах, таких как — StackOverflow. PHP выигрывает этот раунд легко, он имеет большое руководство на сайте php.net и двадцать лет частовстречаемых вопросов. Что бы вы ни делали, кто-то сталкивался с этой проблемой и пытался ее решить за вас.

У Node.js есть хорошая документация, но технология довольно молода, поэтому и ответов на форумах, будет значительно меньше.

Оценка судей — PHP 2:0 Node.js


  • Бруно: промолчал
  • Джеймс: Я согласен. Node.js более молодая технология, поэтому сейчас с поддержкой и документацией хуже. Эта проблема, однако, становится всё менее и менее серьёзной по мере взросления Node.

Третий раунд: синтаксис языка


В отличие от некоторых языков и фреймворков, PHP не заставит вас работать определенным образом, и растет вместе с вами. Вы можете писать свои маленькие программы на простых функциях PHP4, и они будут отличаться своей красотой от MVC PHP 5+. Однако в таком случае, ваш код может быть хаотичным, вы начнете писать лучший код только с пониманием некоторых вещей.

Синтаксис PHP изменялся с выходом новых версий, из-за чего была проведена работа по обратной совместимости. Вы можете легко перенести код с PHP4 на PHP5. Однако, в следствии такого подхода, в PHP образовался беспорядок (каша).

Например, как вы подсчитать количество символов в строке?

— count()? str_len()? strlen()? mb_strlen()?

Вы найдете в документации для этого несколько функции, но на самом деле, все просто. Вообще, в PHP много функций, которые работают одинаково, попробуйте написать несколько строк кода, не посоветовавшись с наставником.

<?php
        $str = 'Hello world'; 
	$size_1 = count($str);
	$size_2 = strlen($str); // верная функция

	$len = [$size_1, $size_2];
	print_r($len);
?>

C JavaScript все иначе:

    var len = ('Hello world').length; 
    console.log(len);

Мы видим, что JavaScript в тоже время является сравнительно четкий, имея несколько основных тенденций. Его объектно-прототипная модель привлекает разработчиков, и кажется, что синтаксис довольно легкий, но это не так. Вы найдете критику о математических ошибках (0,1 + 0,2 != 0,3) и динамической типизации ('4' + 2 == '42' and '4' — 2 == 2). Но эти ситуации редко вызывают проблемы, и все языки имеют особенности.

PHP имеет множество преимуществ, однако Node.js выигрывает по некоторым причинам:

1. JavaScript кажется самым непонятным языком в мире, но как только вы улавливаете его концепцию, остальные языки становятся громоздкими по сравнению с ним.
2. JavaScript выглядит минимальнее, чем PHP, вам не нужно бороться с тем же UTF-8.
3. Full-stack разработчики могут писать код на JavaScript как на стороне клиента, так и на стороне сервера. Вам больше не нужно переключаться между технологиями.
4. Изучая JavaScript, вам хочется больше и чаще писать на этом языке, про PHP такого нельзя сказать.

Оценка судей — PHP 2:1 Node.js


  • Бруно: Я категорически не согласен с этой точкой. Хотя PHP имеет свои особенности, многие из них были исправлены в последнее время, и многие странности удалены в новейших версиях. С другой стороны, точно такое же есть и в мире JS. Что касаемо серверной части, то тут я тоже не согласен. Клиентская сторона и серверная это разные вещи, и вам в любом случае, придется переключать свой мозг, на сервере такой же свой синтаксис, если мы пишем на Node.js, ежели мы пишем JavaScript-код для браузера. Поработав с JS и PHP, в свое время, первое мне нравится меньше и меньше, хотя это чисто личные предпочтения.
  • Джеймс: Я люблю JavaScript. Я знаю, она имеет свои причуды, и я знаю, что есть несколько подводных камней, но ECMAScript 2015 года исправляет многое, а добавляя интересные новые функции в язык. JavaScript является одновременно мощным и гибким, и может вместить много различных стилей программирования. В отличие от PHP, я люблю писать на JavaScript. Node.js выигрывает в этом раунде.


Четвертый раунд: инструменты разработчика


Обе технологии имеют хороший выбор редакторов, интегрированных сред разработки, отладчиков, валидаторов и других инструментов. Тут можно дать ничью, но все же Node.js имеет прекрасный инструмент, npm — менеджер пакетов, c его помощью можно управлять модулями и зависимостями.

У PHP есть свой менеджер пакетов, разработанный под влиянием npm — Composer. Однако, ежели npm встроен по умолчанию, тот composer придется встраивать самостоятельно. Благодяря npm широкое распространение получили Gulp, Grunt — системы сборки front-end проектов.

Оценка судей — PHP 2:2 Node.js


  • Бруно: В то время как composer был первоначально вдохновлен npm, то теперь он даже лучше, чем npm. Composer не повредить вашу систему, если вы хотите установить две версии одной и того же библиотеки, в отличие от npm. Также в отличие от npm, composer может установить рекурсивные зависимости, в то время как npm просто не можете сделать. Npm также имеет совершенно ужасные сообщения об ошибках, которые называются «дружественными». Наконец, npm не особо работает с Vagrant, и тем самым препятствует вам начать работу должным образом, не говоря уже о том, что они не обращают внимания на желания своих пользователей. Присутствовала ошибка, которая была открыта в течение многих лет, из-за чего пользователям это было не пригодно на Windows — вряд ли это маленькая пользовательская база. PHP имеет свою долю ошибок, конечно, тоже глупых, но те не отталкивали целые ОС в течение многих лет.
  • Джеймс: Я люблю npm. Его легко использовать, и есть тысячи пакетов, доступные для почти любой необходимости. Мне также нравится тот факт, что npm позволяет выбрать между глобальной и локальной установки пакетов (в отличие от таких языков, как Ruby, где это стандарт для ваших драгоценных камней). Такие инструменты, как bower и grunt имеют постоянное место в моей работе, и увеличили мою производительность во много раз.


Пятый раунд: среда


Где могут быть использованы эти технологии. Как их развернуть? Какими платформами поддерживаются? Веб-разработчикам часто нужно создавать приложения, которые только относятся к web, например, разработка онлайн-сервиса, сценарии преобразования данных и т.д.

На PHP вы можете разрабывать десктопные приложения или консольные утилиты, но в основном PHP нужен на стороне сервера и редко выходит за пределы этой границы.

Несколько лет назад, JavaScript использовался исключительно для браузера. С приходом Node.js вы можете писать десктопные и мобильные приложения, а также можно программировать и микроконтроллеры. Node.js расширил границы JavaScript.

Оценка судей — PHP 2:3 Node.js


  • Бруно: Ну, во-первых, мы сравниваем PHP с Node.js, а не PHP с JS. Во-вторых, мы сравниваем языки и среды, где они могут работать. Сказать, что обезьяна лучше, чем рыба, потому что рыбе не удалось подняться на дерево — это просто глупо. Но и обезьяны, и рыба может плавать, так что давайте сравнивать, насколько хорошо они это делают.
  • Джеймс: Несколько особенностей, которые делают Node.js так популярны (скорость, масштабируемость, совместимость с JSON, низкое использование ресурсов), позволяют использовать его для многих других видов применения, например, питающих разработке микроконтроллеров (IoT). Я имею в виду, кто не любит роботов?


Шестой раунд: интеграция


Ваши технологии разработки будут ограничены, если только они не могут интегрироваться с базами данных и драйверами. PHP сильна в этой области. Развитие было в течение многих лет, и его расширения системы позволяют прямую работать с любым хостом при помощи API.

Node.js догоняет быстро, но вы можете изрядно попотеть, чтобы найти современные компоненты интеграции для старых вещей.

Оценка судей — PHP 3:4 Node.js


  • Бруно: Тут я дам ничью. PHP имеет возрастное преимущество, давая ему больше возможностей, но и тут можно было пострадать, от некоторых устаревших интегрированных вещей, например, расширение MySQL, от которого, наконец, сумели избавиться в PHP7.
  • Джеймс: Не уверен, что я согласен с этим. Я бы надеялся на примере «старых, менее популярных в технологии вещами». Один из главных плюсов Node.js — он понимает JSON. JSON является, вероятно, самым важным форматом обмена данных в Интернете, или взаимодействия с NoSQL базами данных. Когда вы работаете с Node.js, данные могут поступать аккуратно слоями без необходимости переформатирования. Вы имеете один синтаксис при общении с базой данных.

Седьмой раунд: хостинг и развертывание


Как легко разворачиваются новенький приложения на настоящем веб-сервере? Тут еще одна чистая победа PHP. Любой хостинг интернета поддерживает PHP. Вы можете получить MySQL базу данных по выгодной цене. Тут PHP значительно проще песочницы (локального сервера) и вы будете точно уведомлены, какие PHP расширения отключены, а какие нет.

Node.js совсем другой зверь, и он может работать на стороне сервера постоянно, без разрыва связи. Для этого, вам придется искать специализированные хостинги. Вам потребуется виртуальное облако (VDS/VPS, серверная среда, с полным доступом). К сожалению, такое могут себе позволить не все хостеры, поэтому и цены будут соответствующие.

Оценка судей — PHP 4:4 Node.js


  • Бруно: молчит
  • Джеймс: В будущем, Node.js многое наверстает. Как правило, веб-сервер PHP распространяется вместе с MySQL. Чтобы увидеть какой-то php код, все, что вам надо сделать, это создать файл с расширением .php и засунуть между <?php и ?> код, загрузить файл на сервер, указать в адресной строке, путь к этому файлу. То же самое нельзя сказать про Node.js. Есть, конечно, много вариантов хостинга для Node.js, но они неизменно требуют более детальной настройки и доступа к командной строке, которая потенциально отталкивает начинающих.

Восьмой раунд: производительность


PHP не сутулиться и есть реальные проекты, и варианты, которые позволяют PHP работать быстрее. Даже самый требовательный разработчик PHP редко беспокоится о скорости, но производительность Node.js, как правило, лучше. Конечно, производительность в значительной степени является следствием опыта и командной разработки, однако, Node.js имеет несколько преимуществ:

1. Меньше зависимостей
Все запросы к приложению PHP должны быть направлены на веб-сервер, который запускает интерпретатор PHP, который обрабатывает код и отдает его. Node.js не нужно так много зависимостей, и, хотя вы почти наверняка используете фреймворк на сервере, такой как express, он совсем легкий и управляет частью вашего приложения.

2. Быстрый интерпретатор
Node.js меньше и проворнее, чем РНР. Это связано с наследием Google, который сделал огромный вклад в производительность JavaScript движка — V8.

3. Приложения работают постоянно
РНР выполняет обычную клиент-серверную модель. Каждый запрос страницы инициирует приложение, загрузка параметров подключения к базе данных, извлечение информации и отображения HTML-кода. В Node.js приложение постоянно работает и его нужно инициализировать только один раз. Например, можно создать один объект подключения к базе данных, которая используется повторно при новом запросе. Правда, есть способы, реализации такого поведения и на PHP с использованием специальных систем, таких как memcached, но это не стандартная функция языка.

4. Событийный, неблокирующий поток ввода/вывода
PHP и большинство других серверных языков используют очевидную модель блокировки. Когда вы делаете запрос на извлечение информации из базы данных, запрос выполнит и завершит процесс, прежде чем перейдет к следующему оператору. В Node.js все иначе. В Node.js не нужно ждать. Вместо этого можно создать функцию обратного вызова, которая, прослушивая процесс, выполняется после того, как действие завершится.

Хоть Node.js приложения заметно быстрее, чем PHP тут есть и свои подводные камни.

Node.js / JavaScript работает в одном потоке, а большинство веб-серверов многопоточные и обрабатывают запросы параллельно. Написание асинхронного кода является сложным и несет свои собственные проблемы.

Оценка судей — PHP 4:5 Node.js


  • Бруно: Заблуждения предостаточно. Во-первых, обсуждения производительности спорные. Любой прирост производительности зависят исключительно от опыта разработчиков и типа приложения. Но даже если это сообщение не является убедительным, вот некоторые из моих собственных аргументов: PHP вполне работает с многопоточным встроенным веб-сервером, это позволяет не использовать внешний сервер полностью, но это не рекомендуется (пока что). Есть также супер быстрые серверы, такие как Nginx, которые делают весь процесс запуска PHP и делегирования запросов к нему незаметными. Такие проекты, как HHVM и Appserver добавляют мощные асинхронные и многопоточные аспекты, сам PHP7 с обновлением версии станет намного мощнее прежнего. Да php приложение получает только статику, и живет всего лишь один раз в запрос, однако и это можно обойти: memcached, ajax. Серверные JS приложения работают в одном запросе по умолчанию. PHP же нужно постоянно делать запросы к странице, чтобы обновить ее, но более того — жизнь одного запроса является только преимуществом, так как мы делаем запрос снова на PHP, наше приложение восстанавливается (каждый раз при запросе), когда оно используется, тем самым мы избегаем проблемы с памятью, очисткой мусора.
  • Джеймс: Node.js распространяется как платформа с высокой производительностью, низкой латентности приложений. Благодаря неблокирующему механизму ввода / вывода и технологии Google Chrome V8, Node.js стал синонимом слов «быстрый» и «масштабируемый». Есть многочисленные истории о том, как Node.js принес серьезные прирост производительности в компании и произвел повышение производительности самих разработчика. Я рад такому, но опять же, это спорный момент.


Девятый раунд: страсть программирования


Это немного сложно сравнивать, но относительно немногие разработчики PHP увлечены самим языком. Когда в последний раз вы читали статью по PHP или смотрели презентацию, которая пленила публику? Возможно, все, что было сказано? Может быть, есть менее увлекательным? Может быть, вы не смотрите в нужных местах? Есть некоторые интересные особенности, которые появились совсем недавно, например, появление — PHP7, но все же эта технология топталась в течение нескольких лет. Это сказалось на самом языке, многие разработчики стали ругать PHP.

JavaScript делит сообщество. Есть те, кто любит его и тех, кто ненавидит его, немногие разработчики сидят на заборе. Тем не менее, ответы по Node.js были в значительной степени положительные и технология находится на гребне волны. Это отчасти потому, что она новая, на данный момент, Node.js выигрывает этот раунд.

Оценка судей — PHP 4:6 Node.js


  • Бруно: Вы, безусловно, смотрите не в тех местах. PHP-сообщество невероятно страстное и очень активно. Есть более 20 крупных конференций в год, а некоторые удивительные темы получают свои обсуждения. Появиление HHVM и PHP7 тоже дает о себе знать. Кроме того, я хотел бы сказать, что это интересно, когда видишь, что разработчики Node.js по-прежнему не научились менять номера версий (версия v0.12.5 на момент написания статьи), даже после 6 лет развития. Многие незрелости, в сочетании с критическими, но игнорируемыми старыми ошибками, могут отталкивать целые операционных систем, все это является то, что серьезный разработчик будет думать дважды. Мне не нравится Node.js. Моz неприязнь основывается на негативном опыте в основном при работе с npm. Возможно все измениться в будущем, но сейчас, я полон страха и отчаяния, когда мне предстоит еще раз использовать Node.js. У всех нас есть свои предпочтения, но важно, чтобы все это оставалось объективным, нам нужно выбирать правильный инструмент для своей работы. Также важно признать, что иногда выбор правильного инструмента влечет за собой неправильный выбор другого. Не слушайте никого. Попробуйте сами — посмотрите, что работает, выясните, что вы чувствуете. В конечном счете, именно то, что вы делаете заставляет вас чувствовать себя продуктивным и это является лучшим выбором, а не тот выбор, который дает вам миллисекунды дополнительного прироста.
  • Джеймс: В сообществе Node.js очень жарко. Существует много открытий в Node.js-мире. Несмотря на то, моя страсть является субъективной, я рад, что Node.js выиграл этот раунд.

Деcятый раунд: будущее


Это не особо важно, какой язык вы используете на стороне сервера, он все равно будет продолжать работать, даже если проект заброшен. Многие продолжают использовать PHP. Это безопасная ставка и ее поддержка выглядит уверенной еще двадцать лет.
При этом мы знаем, что восхождение Node.js было быстрым. Современный подход к развитию очевиден тем, что использует тот же синтаксис, что и на клиентской стороне. JavaScript поддерживает HTML5, веб-сокеты. Node.js неизбежно отнимает долю на рынке, но PHP, я сомневаюсь, что будет обгонять. Обе технологии имеют большое будущее. Я заявляю, этот раунд заканчивается ничьей.

Оценка судей — PHP 5:7 Node.js


  • Бруно: молчание.
  • Джеймс: Ничья была справедливым результатом этого раунда. Node.js является восходящей звездой, но массивный PHP ему не свергнуть. В завершение можно добавить, если ваш инструмент кажется молотком, то каждая проблема кажется гвоздем. Node.js не идеально подходит для каждого сценария, и в самом деле лучше много раз подумать, когда и где, имеет смысл использовать его. Тем не менее, там где Node.js плох, это даже очень хорошо. Вы сможете сделать осознанный выбор и выбрать лучший инструмент для своей работы.

Абсолютный победитель


Окончательный счет 5:7 в пользу Node.js. Node.js имеет крутую кривую обучения и не является идеальным для начинающих разработчиков, но он все же выигрывает. Просто. Если вы грамотный JavaScript-программист, который любит свой язык, Node.js не разочарует вас. Вы почувствуете себя свежее и получите освободительный опыт веб-разработки. Но не стоит сбрасывать PHP со счетов. PHP жив, и есть мало оснований ставить подножку PHP, из-за того, что это выглядит модным. PHP проще изучить, вы сможете овладеть профессиональными приемы программирования, главное практика. PHP очень легко развернуть на сервере. Даже упертые Node.js-разработчики должны использовать PHP для простых сайтов и приложений.

Мой совет: оценить варианты и выбрать язык, основанный на ваших требованиях. Это гораздо более практично, чем полагаться на «за и против»!
Tags:
Hubs:
-15
Comments105

Articles

Change theme settings