Лекция
Привет, Вы узнаете о том , что такое php vs nodejs сравнение возможностей языков программирования, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое php vs nodejs сравнение возможностей языков программирования , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend) .
Чтобы чтото понять лучше рассматривать на наглядном примере с схемами. Поэтому проанализируем небольшой “абстрактный сайт в вакууме” и примем некоторые условия.
Пусть у нас имеется некий сайт, который понимает всего два запроса:
Запрос А выполняется за 1 секунду, он не требует обращение к Базы Данных .
Запрос Б выполняется за 5 секунд, причем 4 из них, он тратит на ожидание ответа Базы Данных .
Так же условимся что время между запросами не менее 1 секунды.
Так же условимся что время между запросами не менее 1 секунды.
Рассмотрим как работает на php.
В самой упрощенной форме архитектура сервера выглядит так:
Важно тут следующие, веб сервер получив запрос от клиента передает его в php процесс. В свою очередь процесс php в один момент времени может обрабатывать один запрос, по завершению работы, результат возвращается веб серверу, а сам процесс перестает существовать. Веб сервер получая ответ отправляет результат клиенту и закрывает соединение.
При наличии всего одного php процесса, работу нашего сервера можно смоделировать с помощью такой схемы:
Из диаграммы видно, что пока к нам поступают только запросы А наш сервер бодро на них отвечает и в целом выполняет поставленным задачи, но как только к нам приходит запрос Б, сервер перестает отвечать на запросы, до момента пока не будет готов ответ на запрос Б. Так же на схеме видно что большую часть времени запроса Б “все” ждут результат работы базы данных.
Для решения этой проблемы приходиться увеличивать количество php процессов, давайте увеличим до 2х, в результате диаграмма станет такой :
Из этой схемы видно, что запрос Б “ожидает” в обработку в первом php процессе, при этом сервер продолжает отвечать на остальные запросы. Все будет идти хорошо до момента, когда к нам не придут два запроса Б, тогда оба php процесса “повиснут” в ожидании ответа базы, и сервер в целом перестанет отвечать, до момента пока один из них не освободиться.
Ну мы то уже знаем что делать? Правильно, возьмем и увеличим кол-во php процессов, сразу до 20 или 30 и проблема вроде как ушла, хотя на самом деле проблема просто немного отдалилась и момент когда придет 30 запросов Б наступит. Вся беда в том что мы не можем создавать бесконечно много php процессов и путь наращивать их в запредельных количествах неверен.
Самое главное в что следует вынести из этих схем, это то, что операции работы с базой данных в php выполняются синхронно. В нашем случае процесс выполнивший запрос к базе неспособен обработать другие запросы и вынужден “висеть” (ничего не делая) ожидая ответ от базы данных.
Что дает нам nodejs? Сначала посмотрим как выглядит простой сервер:
Сразу бросается в глаза то, что сервер включает в себя обработчики непосредственно запросов А и Б, а так же сам Веб сервер. Все это добро крутится в одном node процессе и постоянно висит в памяти.
Посмотрим на диаграмму работы:
На схеме хорошо видно что запросы Б не приводят к “подвисанию” сервера в ожидании ответа базы. Сервер получив запрос Б, просто сформирует и отправит запрос в базу данных, и продолжит отвечать на остальные запросы, как только ответ от базы будет получен, сервер вернет результат клиенту. В случае nodejs неважно как и в каком количестве придут запросы Б, ни один из них не приведет к “подвисанию” в ожидании ответа базы.
Вывод
Работая на nodejs не делайте что то так, как вы делали это в php.
Помните что вы работаете в асинхронной среде, не используйте операции приводящие к блокировке, этим вы убиваете идею nodejs.
Помните что nodejs обрабатывает множество запросов в одном процессе постоянно висящем в памяти, поэтому следите за своими переменными и тем как вы расходуете память.
Не стоит запускать 50 процессов node для одного сайта, да и вообще не стоит запускать их больше кол-ва ядер на процессоре, большее их количество только замедлит работу в целом.
Nodejs это не серебряная пуля и одно лишь ее использование не решит проблем масштабирования и работой под большой нагрузкой.
Существует много статей на эту тему, с качественными характеристическими анализами и прогнозами производительности. Однако, мне все же хотелось найти такую статью, где профессиональные программисты делятся своими мнениями и пытаются что-то подсказать, предостеречь новичка, который только изучает PHP или NodeJS (cерверный JavaScript). Многие не любят PHP и говорят, что PHP плохой (да, там есть сборщик мусора, который уничтожает наши переменные после выполнения скрипта ), однако, что теперь не учить PHP совсем, в то время как на нем работает 80% сайтов в интернете. Поэтому, если мы хотим быть профессионалами и пытаться хоть как-то расширить свой кругозор, нам нужно четко разделять задачи PHP и задачи NodeJS, а не сливать все в кучу.
Одним прекрасным днем Крэг Баклэр (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:
Почему не говорим о 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. Если вы написали этот код в файле index.php и запустили на локальном сервере через порт 8787 (на своем компьютере, а не на реальном хостинге), то его отображение будет доступно по адресу:
http://localhost:8787
.
Однако, используя готовый интерпретатор PHP со встроенным сервером довольно ненадежное занятие. Об этом говорит сайт https://intellect.icu . Лучше использовать готовые решения, сборки Apache — XAMPP или виртуальные OS (Vagrant). Кстати, свой файл вы сможете загрузить на любой хостинг интернета.
2) Установить платформу Node.js проще простого, если вы работаете на unix-подобных системах, вы сможете это сделать и при помощи менеджеров пакетов. Давайте создадим страницу index.js:
const http = require('http'); const hostname = 'localhost'; const port = 8787; 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 и запустили на локальном сервере через порт 8787 (на своем компьютере, а не на реальном хостинге), то его отображение также будет доступно по адресу (при условии, что php теперь работает на другом порту):
http://localhost:8787
Теперь давайте оценим код, даже если вы хорошо знаете клиентский JavaScript, вам придется думать и разбираться с тем, что же здесь написано. Вы должны понимать замыкания и callback-функции, промисы, программирование на стороне Node.js требует некоторой сноровки.
PHP концептуально проще и выигрывает этот раунд. Хотя PHP имеет несколько программных зависимостей, однако PHP менее сложный для изучения.
Оценка судей — PHP 1:0 Node.js
Второй раунд: помощь и поддержка
На самом деле вы никуда не уедете на своих знаниях без изучения каких-либо курсов, современных практик, чтобы развиваться, вам нужно задавать вопросы на форумах, таких как — StackOverflow. PHP выигрывает этот раунд легко, он имеет большое руководство на сайте php.net и двадцать лет частовстречаемых вопросов. Что бы вы ни делали, кто-то сталкивался с этой проблемой и пытался ее решить за вас.
У Node.js есть хорошая документация, но технология довольно молода, поэтому и ответов на форумах, будет значительно меньше.
Оценка судей — PHP 2:0 Node.js
Третий раунд: синтаксис языка
В отличие от некоторых языков и фреймворков, PHP не заставит вас работать определенным образом, и растет вместе с вами. Вы можете писать свои маленькие программы на простых функциях PHP4, и они будут отличаться своей красотой от MVC PHP 5+. Однако в таком случае, ваш код может быть хаотичным, вы начнете писать лучший код только с пониманием некоторых вещей.
Синтаксис PHP изменялся с выходом новых версий, из-за чего была проведена работа по обратной совместимости. Вы можете легко перенести код с PHP4 на PHP5. Однако, в следствии такого подхода, в PHP образовался беспорядок (каша).
Например, как вы подсчитать количество символов в строке?
— count()? str_len()? strlen()? mb_strlen()?
Вы найдете в документации для этого несколько функции, но на самом деле, все просто. Вообще, в PHP много функций, которые работают одинаково, попробуйте написать несколько строк кода, не посоветовавшись с наставником.
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
Четвертый раунд: инструменты разработчика
Обе технологии имеют хороший выбор редакторов, интегрированных сред разработки, отладчиков, валидаторов и других инструментов. Тут можно дать ничью, но все же Node.js имеет прекрасный инструмент, npm — менеджер пакетов, c его помощью можно управлять модулями и зависимостями.
У PHP есть свой менеджер пакетов, разработанный под влиянием npm — Composer. Однако, ежели npm встроен по умолчанию, тот composer придется встраивать самостоятельно. Благодяря npm широкое распространение получили Gulp, Grunt — системы сборки front-end проектов.
Оценка судей — PHP 2:2 Node.js
Пятый раунд: среда
Где могут быть использованы эти технологии. Как их развернуть? Какими платформами поддерживаются? Веб-разработчикам часто нужно создавать приложения, которые только относятся к web, например, разработка онлайн-сервиса, сценарии преобразования данных и т.д.
На PHP вы можете разрабатывать десктопные приложения или консольные утилиты, но в основном PHP нужен на стороне сервера и редко выходит за пределы этой границы.
Несколько лет назад, JavaScript использовался исключительно для браузера. С приходом Node.js вы можете писать десктопные и мобильные приложения, а также можно программировать и микроконтроллеры. Node.js расширил границы JavaScript.
Оценка судей — PHP 2:3 Node.js
Шестой раунд: интеграция
Ваши технологии разработки будут ограничены, если только они не могут интегрироваться с базами данных и драйверами. PHP сильна в этой области. Развитие было в течение многих лет, и его расширения системы позволяют прямую работать с любым хостом при помощи API.
Node.js догоняет быстро, но вы можете изрядно попотеть, чтобы найти современные компоненты интеграции для старых вещей.
Оценка судей — PHP 3:4 Node.js
Седьмой раунд: хостинг и развертывание
Как легко разворачиваются новенький приложения на настоящем веб-сервере? Тут еще одна чистая победа PHP. Любой хостинг интернета поддерживает PHP. Вы можете получить MySQL базу данных по выгодной цене. Тут PHP значительно проще песочницы (локального сервера) и вы будете точно уведомлены, какие PHP расширения отключены, а какие нет.
Node.js совсем другой зверь, и он может работать на стороне сервера постоянно, без разрыва связи. Для этого, вам придется искать специализированные хостинги. Вам потребуется виртуальное облако (VDS/VPS, серверная среда, с полным доступом). К сожалению, такое могут себе позволить не все хостеры, поэтому и цены будут соответствующие.
Оценка судей — PHP 4:4 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 увлечены самим языком. Когда в последний раз вы читали статью по PHP или смотрели презентацию, которая пленила публику? Возможно, все, что было сказано? Может быть, есть менее увлекательным? Может быть, вы не смотрите в нужных местах? Есть некоторые интересные особенности, которые появились совсем недавно, например, появление — PHP7, но все же эта технология топталась в течение нескольких лет. Это сказалось на самом языке, многие разработчики стали ругать PHP.
JavaScript делит сообщество. Есть те, кто любит его и тех, кто ненавидит его, немногие разработчики сидят на заборе. Тем не менее, ответы по Node.js были в значительной степени положительные и технология находится на гребне волны. Это отчасти потому, что она новая, на данный момент, Node.js выигрывает этот раунд.
Оценка судей — PHP 4:6 Node.js
Десятый раунд: будущее
Это не особо важно, какой язык вы используете на стороне сервера, он все равно будет продолжать работать, даже если проект заброшен. Многие продолжают использовать PHP. Это безопасная ставка и ее поддержка выглядит уверенной еще двадцать лет.
При этом мы знаем, что восхождение Node.js было быстрым. Современный подход к развитию очевиден тем, что использует тот же синтаксис, что и на клиентской стороне. JavaScript поддерживает HTML5, веб-сокеты. Node.js неизбежно отнимает долю на рынке, но PHP, я сомневаюсь, что будет обгонять. Обе технологии имеют большое будущее. Я заявляю, этот раунд заканчивается ничьей.
Оценка судей — PHP 5:7 Node.js
Абсолютный победитель схватки
Окончательный счет 5:7 в пользу Node.js. Node.js имеет крутую кривую обучения и не является идеальным для начинающих разработчиков, но он все же выигрывает. Просто. Если вы грамотный JavaScript-программист, который любит свой язык, Node.js не разочарует вас. Вы почувствуете себя свежее и получите освободительный опыт веб-разработки. Но не стоит сбрасывать PHP со счетов. PHP жив, и есть мало оснований ставить подножку PHP, из-за того, что это выглядит модным. PHP проще изучить, вы сможете овладеть профессиональными приемы программирования, главное практика. PHP очень легко развернуть на сервере. Даже упертые Node.js-разработчики должны использовать PHP для простых сайтов и приложений.
Мой совет: оценить варианты и выбрать язык, основанный на ваших требованиях. Это гораздо более практично, чем полагаться на «за и против»!
В заключение, эта статья об php vs nodejs сравнение возможностей языков программирования подчеркивает важность того что вы тут, расширяете ваше сознание, знания, навыки и умения. Надеюсь, что теперь ты понял что такое php vs nodejs сравнение возможностей языков программирования и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Ответы на вопросы для самопроверки пишите в комментариях, мы проверим, или же задавайте свой вопрос по данной теме.
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)