Веб переживает эпоху стремительного развития. Разработчики серверной части очень растеряны при выборе языка. Есть давно доминирующие языки, такие как C, Java и Perl, и языки, ориентированные на веб-разработку, такие как Ruby, Clojure и Go. Пока ваш проект хорошо работает, ваш выбор не кажется таким уж важным.

Но как этим новым веб-разработчикам сделать правильный выбор?
Я не хочу начинать войну между лагерями PHP и Node.js. Я сравню состояние разработки этих двух языков в их соответствующих областях:
- PHP
Расмус Лердорф создал PHP в 1994 году. Он работает с помощью компонентов, устанавливаемых на веб-серверы (Apache, Nginx). Код PHP можно смешивать с HTML. Новички могут быстро писать полезный код без большой практики. Это сделало PHP всё более популярным; сейчас PHP работает на 80% серверов по всему миру. WordPress, система управления контентом, используемая четвертью веб-сайтов мира, написан на PHP. - Node.js
Райан Даль создал Node.js в 2009 году. Он основан на JavaScript-движке V8 от Google (который выполняет клиентский JavaScript-код в браузере Chrome). В отличие от других языков, Node.js имеет встроенные библиотеки для обработки сетевых запросов и ответов, поэтому вам не нужен отдельный сервер (Apache, Nginx) или другие зависимости. Хотя Node.js очень новый, он быстро приобрёл большую популярность. Его используют многие крупные компании, такие как Microsoft, Yahoo, LinkedIn и PayPal.
А как же наши любимые C#, Java, Ruby, Python, Perl, Erlang, C++, Go, Dart, Scala, Haskell и так далее?
Если бы статья сравнивала различные параметры всех вышеперечисленных языков, она была бы очень длинной. Вы всё ещё стали бы её читать? Вы ожидаете, что программист знает все языки программирования? Это явно невозможно. Я в основном сравнил PHP и Node.js по следующим основным причинам:
- Во-первых, их стоит сравнивать. Оба имеют открытый исходный код, оба ориентированы на веб-разработку, и оба могут использоваться в похожих проектах.
- PHP существует уже давно, но Node.js только появляется и привлекает всё больше внимания. Стоит ли PHP-программистам верить в шумиху вокруг Node.js? Стоит ли им задуматься о смене языка?
- Я понимаю и люблю языки программирования. Я использую PHP и JavaScript с 1990-х годов, а также имею несколько лет опыта работы с Node.js. Кроме того, я пробовал и другие технологии, но пока не могу дать им объективную оценку здесь.
Кроме того, не имеет значения, сколько языков сравнивается, потому что всегда найдётся кто-то где-то, кто пожалуется, что я не упомянул его язык.
Битва на SitePoint
Программисты тратят много времени на улучшение своих навыков программирования. У некоторых людей есть навыки, переносимые между языками программирования, но те, кто достигает более высокого уровня, делают свой выбор, основываясь на многих факторах. На субъективном уровне вы будете продвигать и защищать свои технические решения.
SitePoint Smackdowns не использует подход «выбирай то, что тебе подходит, друг». Я буду давать рекомендации, основываясь на личном опыте, требованиях и предпочтениях. Вы можете не соглашаться со всем, что я говорю, и это не важно; важно то, что ваши мнения помогут другим сделать более осознанный выбор.
Метод оценки
Ниже PHP и Node.js будут сравниваться в десяти раундах. В каждом раунде будут рассмотрены общие задачи разработки, которые можно применить к любой веб-технологии. Мы не будем углубляться в детали; мало кого волнует ценность генераторов случайных чисел или сортировки массивов.
Победителем станет тот, кто выиграет больше раундов. Готовы? Пусть битва начнётся...
Раунд первый: начало работы
Как быстро можно создать веб-страницу «Hello World»? В PHP:
<?php
echo 'Hello World!';
?>
Этот код можно поместить в любой файл, который может быть обработан движком PHP – обычно это файл с расширением .php. Просто введите URL в браузере, чтобы перейти к файлу.
Признаться, это ещё не всё. Этот код может работать только на веб-сервере с установленным PHP (у PHP есть встроенный сервер, но всё же лучше использовать более надёжный). Большинство операционных систем предоставляют серверное программное обеспечение, например IIS в Windows, Apache в Mac и Linux, хотя они требуют запуска и настройки. Часто используются готовые установщики, такие как XAMPP, или образы виртуальных машин (например, Vagrant). Более простой способ: загрузите свои файлы на любой веб-хостинг.
В отличие от этого, установка Node.js — проще простого. Вы можетескачать установщикилииспользовать менеджер пакетов. Теперь давайте создадим веб-страницу в hello.js:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World!');
}).listen(3000, '127.0.0.1');
Прежде чем открыть http://127.0.0.1:3000/ в браузере, вам нужно ввести node hello.js в терминале, чтобы запустить приложение. Пятью строками кода выше мы создали небольшой веб-сервер. Хотя это удивительно, это трудно понять даже людям с большим опытом клиентского JavaScript.
PHP побеждает в этом раунде, потому что он концептуально проще. Человек с небольшими знаниями инструкций PHP может создать что-то полезное. У PHP больше программных зависимостей, но концепции PHP менее громоздки для новичков.
Знать немного JavaScript и разрабатывать приложения на Node.js — это две разные вещи. Методы разработки на Node.js отличаются от большинства серверных технологий. Сначала нужно понять некоторые довольно сложные концепции, такие как замыкания и функции обратного вызова.
Раунд второй: помощь и поддержка
Без помощи официальной документации и ресурсов (курсов, форумов, Stack Overflow) вы неизбежно столкнётесь с трудностями. PHP легко побеждает в этом раунде; у него множество руководств и двадцать лет вопросов и ответов. Что бы вы ни захотели сделать, кто-то уже сталкивался с той же проблемой до вас.
У Node.js хорошая документация, но он моложе и предлагает меньше помощи, чем PHP. JavaScript существует на рынке так же давно, как PHP, но большая часть помощи предназначена для разработки в браузере, что здесь в основном бесполезно.
Раунд третий: синтаксис языка
Логичны ли объявления и структура и удобны ли они для использования?
В отличие от некоторых языков и фреймворков, PHP не заставляет вас писать определённым образом; это ваш выбор. Вы можете начать с нескольких строк кода, затем добавить несколько методов, потом написать простые объекты в стиле PHP4 и наконец построить элегантные объектно-ориентированные приложения на PHP5+ по шаблону MVC. Сначала ваш код может быть беспорядочным, но он работает и будет улучшаться по мере более глубокого понимания.
Синтаксис PHP может немного меняться от версии к версии, но обратная совместимость в целом хорошо поддерживается. К сожалению, это также приводит к проблеме: PHP — это беспорядочная мешанина. Например, как посчитать количество символов в строке? Это count? str_len? Или strlen? Или mb_strlen? В PHP сотни функций, и соглашения об именовании не полностью последовательны. Попробуйте написать несколько строк кода, не заглядывая в документацию.
JavaScript относительно проще: в нём всего несколько десятков основных инструкций. Однако разработчики часто критикуют его синтаксис, потому что его прототипная объектная модель кажется простой, но на самом деле таковой не является. Кроме того, разные математические ошибки (0.1 + 0.2 != 0.3) и беспорядочное приведение типов ('4' + 2 == '42' и '4' - 2 == 2) вызвали много жалоб, но такие ситуации редко создают проблемы; у большинства языков есть подобные оправдания.
У PHP есть свои преимущества, но в этом раунде я признаю победителем Node.js. Причины следующие:
- JavaScript — самый трудный для понимания язык в мире, но однажды, когда к вам придёт озарение и концепции уложатся в голове, вы обнаружите, что другие языки слишком громоздкие.
- Код на JavaScript лаконичнее, чем на PHP. Например, вам больше не нужно преобразовывать данные в JSON и обратно — как и в UTF-8 и обратно.
- Full-stack-разработчики могут использовать JavaScript и на клиентской, и на серверной стороне. Мозгу не нужно переключаться туда-сюда.
- Глубокое понимание JavaScript заставляет вас хотеть использовать его чаще, а с PHP это не так.
Четвёртый раунд: инструменты разработки
У обеих технологий есть несколько отличных редакторов, интегрированных сред разработки, отладчиков, валидаторов и других инструментов. Я считаю, что это ничья, но есть несколько инструментов, которые дают Node.js небольшое преимущество: NPM — менеджер пакетов. NPM позволяет устанавливать зависимости и управлять ими, задавать переменные конфигурации, определять скрипты и многое другое.
Проект Composer для PHP был вдохновлён NPM и в некоторых аспектах сильнее. Однако PHP не предоставляет его по умолчанию, его активная библиотека меньше, и его влияние на сообщество меньше.
NPM также заслуживает некоторого признания за рост таких инструментов сборки, как Grunt и Gulp, которые произвели революцию в методах разработки. Иногда PHP-разработчикам может захотеться или понадобиться установить Node.js; это не шаг назад.
Пятый раунд: Окружение
Где технологию можно использовать и развёртывать? Какие платформы и экосистемы поддерживаются? Веб-разработчикам часто нужно разрабатывать приложения, не полностью ориентированные на веб, например инструменты сборки, инструменты миграции, скрипты преобразования баз данных и т. д.
В PHP есть способы разработки настольных приложений и инструментов командной строки, но вы вряд ли станете их использовать. По сути, PHP — это серверная технология; она преуспевает в этой области, но редко выходит за её пределы.
Несколько лет назад JavaScript считался очень ограниченным, с некоторыми периферийными технологиями, но его главной ареной был браузер. Node.js изменил это восприятие и вызвал взрыв проектов на JavaScript. Вы можете использовать JavaScript где угодно: в браузере, на сервере, в терминале, на настольных компьютерах, даже во встраиваемых системах, что делает JavaScript вездесущим.
Шестой раунд: Интеграция
Технологии разработки очень ограничены, если они не могут интегрироваться с базами данных и драйверами. PHP силён в этой области. PHP существует уже много лет, и его расширения позволяют ему напрямую взаимодействовать с серверами, у которых есть распространённые или малоизвестные API.
Node.js быстро догоняет, но у вас может возникнуть головная боль при поиске зрелых компонентов интеграции для некоторых старых, малоизвестных технологий.
Раунд седьмой: хостинг и развертывание
Насколько легко развернуть ваше новое блестящее приложение на онлайн-веб-сервере? Это ещё одна безоговорочная победа PHP. Свяжитесь с любой первой попавшейся компанией веб-хостинга, и вы найдёте широкую поддержку PHP, возможно, с бесплатно включённым MySQL. Для песочниц PHP считается проще, а рискованные расширения можно отключить.
Node.js — совсем другой зверь; серверные приложения работают постоянно. Вам нужна физическая/виртуальная/облачная или настроенная серверная среда, желательно с root-доступом, который недоступен на некоторых серверах, особенно на общих; вы можете уронить весь сервер.
Хостинг Node.js станет проще, но я не думаю, что он когда-либо сможет быть таким же удобным, как загрузка нескольких PHP-файлов через FTP.
Раунд восьмой: производительность
PHP — трудяга, и есть много проектов и вариантов, которые могут сделать его быстрее. Даже PHP-разработчики со строгими требованиями к производительности редко беспокоятся о скорости, но Node.js в целом имеет лучшую производительность. Конечно, производительность во многом зависит от опыта и самоотдачи команды разработчиков, но у Node.js всё ещё есть следующие преимущества:
Меньше зависимостей
Все запросы к PHP-приложениям должны маршрутизироваться через веб-сервер, чтобы запустить интерпретатор PHP и выполнить PHP-код. Node.js не нуждается в этих зависимостях, и вы почти наверняка будете использовать фреймворк с сервером, например Express, который лёгок и хорошо выполняет роль части вашего приложения.
Меньший и более быстрый интерпретатор
Интерпретатор Node.js меньше и гибче, чем у PHP. Он не обременён проблемами обратной совместимости со старыми версиями языка, и Google много сделал для повышения производительности движка V8.
Приложения всегда онлайн
PHP следует стандартной клиент-серверной модели. Каждый запрос страницы инициализирует приложение; вы читаете параметры конфигурации, подключаетесь к базе данных, читаете информацию, рендерите HTML. Приложения Node.js работают постоянно и требуют запуска только один раз. Например, вы можете создать один объект подключения к базе данных и повторно использовать его во всех запросах. Признаться, в PHP тоже есть способы добиться этого, например с помощью Memcached, но это уже не является стандартной возможностью языка.
Событийно-ориентированный, неблокирующий ввод-вывод
PHP, как и большинство других серверных языков, использует блокирующую модель выполнения. Когда вы выполняете команду, например извлекаете данные из базы данных, вы должны дождаться завершения этой команды, прежде чем выполнять следующее действие. Node.js обычно не ждет. Вместо этого вы предоставляете функцию обратного вызова, которая будет вызвана один раз после завершения команды. Например:
// fetch records from a NoSQL database
DB.collection('test').find({}).toArray(process);
console.log('finished');
// process database information
function process(err, recs) {
if (!err) {
console.log(recs.length + ' records returned');
}
}
В этом примере консоль сначала выведет 'finished', затем выведет 'N records returned', потому что функция process вызывается только тогда, когда все данные возвращены. Иными словами, интерпретатор может делать другие вещи, пока обрабатывает другие процессы.
Обратите внимание, что ситуация сложнее, и есть несколько оговорок:
- Node.js/JavaScript может работать только в одном потоке, но большинство веб-серверов являются многопоточными и обрабатывают запросы одновременно.
- Длительно выполняющийся JavaScript-процесс одного пользователя будет препятствовать выполнению кода других пользователей, если только вы не разделите задачу или не используете...Web Workers。
- Бенчмарки субъективны и несовершенны; вы можете найти примеры, где Node.js лучше, и противоположные примеры, где PHP лучше. Программисты просто пытаются доказать свои убеждения!
- Написание асинхронного, событийно-ориентированного кода — очень сложная и трудная задача.
Я могу говорить только исходя из своего опыта: мои приложения на Node.js значительно быстрее аналогичных приложений на PHP. Ваши могут быть и не быстрее, но вы никогда не узнаете, пока не попробуете.
Раунд девятый: Страсть разработчика
Это выходит за рамки цели «обычных задач веб-разработки», но это важно. Если вы каждый день со страхом садитесь писать код, то не имеет значения, какой язык лучше.
Это трудно сравнить, но некоторые PHP-разработчики страстно любят PHP. Когда вы в последний раз читали статью или слайд-шоу о PHP, которое вас тронуло? Возможно, больше нечего сказать? Может, это меньшая освещённость? Или я искал не там, где нужно? В PHP 7 появились некоторые новые возможности, но технология находилась в застое много лет. И всё же мало кто из разработчиков жалуется на PHP.
JavaScript раскалывает сообщество: одни его любят, другие ненавидят, а некоторые программисты ещё не определились. И всё же отзывы о Node.js в основном положительные. Он в авангарде, отчасти потому что новый, и похвала может быть недолгой. Пока что Node.js побеждает в этом раунде.
Раунд десятый: перспективы
Неважно, какой серверный язык вы решите использовать; даже если его больше не обновляют, он продолжит работать (ура, ColdFusion!). Хотя использование стабилизируется, многие по-прежнему используют PHP. Я гарантирую, что он продержится ещё двадцать лет.
Node.js стремительно вырос. Он предлагает современный подход к разработке, используя тот же синтаксис, что и при разработке на стороне клиента, при этом поддерживая революционные возможности HTML5, такие как WebSockets и Server-Sent Events. Несмотря на некоторые споры о форкнутых функциях языка, использование Node.js всё ещё растёт экспоненциально.
Node.js неизбежно отвоюет часть доли рынка PHP, но я не думаю, что он сможет полностью его заменить. У обеих технологий светлое будущее. Я объявляю этот раунд ничьей.
Финальный победитель
Итоговый счёт: Node.js побеждает в 5 раундах, PHP — в 4 раундах, одна ничья. Я думал, что будет перевес в одну сторону, но результат оказался более умеренным, чем я ожидал.
У Node.js есть определённая кривая обучения, она не идеальна для новичков, но в этом противостоянии победил он. Более того, если вы опытный JavaScript-программист, которому нравится этот язык, Node.js вас не подведёт. Он более современный и предлагает собственный опыт веб-разработки; вы не будете скучать по PHP.
Но не стоит принижать PHP; PHP по-прежнему полон жизни. Не стоит переходить на Node.js только потому, что Node.js быстрее, новее или моднее. PHP легко изучать, и он по-прежнему поддерживает профессиональные методы программирования. Помощь есть повсюду, а разработка проста. Даже заядлые разработчики Node.js должны рассмотреть использование PHP для простых сайтов и приложений.
Мой совет: оцените варианты, выбирайте язык исходя из ваших потребностей — это гораздо надёжнее, чем статьи-«сравнения», подобные этой.
Источник: http://www.oschina.net/translate/php-vs-node-js