Menu

PHP или JavaScript: сервер, браузер и Node.js

PHP работает на сервере и отправляет в браузер готовый HTML. JavaScript работает в браузере, где меняет страницу после загрузки, а с Node.js и на сервере. Большинство сайтов используют оба: PHP для страниц и API, JavaScript для интерактивности.

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

PHP работает на сервере: собирает страницу, отправляет готовый HTML и завершается. JavaScript работает в браузере посетителя, где реагирует на клики и меняет страницу после загрузки; с Node.js он может работать и на сервере. Так что эти языки не столько соперники, сколько партнёры: типичный сайт использует PHP (или Node.js) на сервере и JavaScript в браузере.

Этот PHP-код выполняется на сервере. Браузер получает только то, что он напечатал, а вкладка Page показывает результат:

Посмотрите на вкладку Output: PHP там не осталось, только HTML. Тот же список, собранный JavaScript в браузере, выглядит так:

const products = [
  { name: "Keyboard", price: 49 },
  { name: "Mouse", price: 19 },
  { name: "Monitor", price: 189 },
];

const ul = document.querySelector("#cart"); // an empty <ul id="cart"> in the HTML
for (const p of products) {
  const li = document.createElement("li");
  li.textContent = `${p.name}: $${p.price}`;
  ul.append(li);
}

Версия на PHP отправляет полную страницу, которую поисковики и медленные телефоны читают сразу. Версия на JavaScript может обновить список позже без перезагрузки, например когда посетитель удаляет товар.

Где выполняется каждый язык

PHPJavaScript
Где выполняетсяна веб-сервере (или в терминале)в браузере, а на сервере через Node.js, Deno или Bun
Что видитфайлы, базы данных, окружение, секретыстраницу (DOM), клики, хранилище браузера
Время жизниодин запуск на запроспока открыта страница (браузер) или один долгий процесс (Node.js)
Типичная задачасобирать страницы, обрабатывать формы, API, работать с базойинтерактивность, живые обновления, одностраничные приложения, серверы на Node.js
Посетитель может прочитать коднетда, в браузере

Последняя строка важна для безопасности: всё, что есть в браузерном JavaScript, видно посетителю, поэтому пароли, API-ключи и проверки цен должны быть на сервере.

Синтаксис рядом

Языки похожи, потому что оба заимствуют у C: фигурные скобки, if, for, while, function, return. Различия в деталях:

ЗадачаPHPJavaScript
Переменная$name = "Ada";let name = "Ada";
Константаconst MAX = 10;const MAX = 10;
Склеить строки"Hi " . $name"Hi " + name
Шаблонная строка"Hi $name"`Hi ${name}`
Список["a", "b"]["a", "b"]
Ключ/значение["id" => 1]{ id: 1 }
Длинаcount($list), strlen($s)list.length, s.length
Циклforeach ($list as $item)for (const item of list)
Стрелочная функцияfn($x) => $x * 2(x) => x * 2
Выводecho "Hi";console.log("Hi");

Вот функция с колбэком на PHP:

И на JavaScript, где map и filter это методы массива:

const prices = [12.5, 8, 30, 4.25];

const withTax = prices.map((p) => Math.round(p * 1.2 * 100) / 100);
const cheap = withTax.filter((p) => p < 15);

console.log(withTax.join(", "));
console.log("Under 15: " + cheap.join(", "));

Оператор +: классическая ловушка

В JavaScript + и складывает числа, и склеивает строки, поэтому одна строка превращает сложение в конкатенацию. PHP разделяет эти действия: + всегда складывает, а . всегда склеивает.

console.log("10" + 5);  // "105"
console.log("10" - 5);  // 5
console.log("3" * "4"); // 12
console.log(0.1 + 0.2 === 0.3); // false

В обоих языках также есть нестрогое == и строгое ===. Совет одинаковый: используйте ===, если не собираетесь сравнивать значения разных типов.

Передача данных из PHP в JavaScript

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

Вкладка Output показывает сгенерированный скрипт с уже подставленными данными. Флаг JSON_HEX_TAG экранирует < и >, так что значение с </script> не сможет преждевременно закрыть скрипт. Подробнее об опциях в json_encode.

В обратную сторону данные идут через HTTP: браузерный JavaScript вызывает fetch("/api/cart.php"), PHP-скрипт выполняется и отвечает JSON:

<?php
// api/cart.php
header('Content-Type: application/json');
echo json_encode(['items' => 3, 'total' => 257]);
const res = await fetch("/api/cart.php");
const cart = await res.json();
console.log(cart.total); // 257

PHP или Node.js на сервере

Когда JavaScript работает на сервере через Node.js, сравнение превращается в настоящий выбор.

PHPNode.js
Модельсвежий запуск на каждый запрос, ничего общегоодин долгоживущий процесс с циклом событий
Ожидание ввода-выводаблокирует этот запрос (другие запросы идут в других воркерах)неблокирующее, async/await
В чём хорошсайты с серверным рендерингом, CMS, классические CRUD-приложенияприложения реального времени, веб-сокеты, много простаивающих соединений
Хостинглюбой виртуальный хостинг, PHP-FPMменеджер процессов Node или платформа вроде Vercel
Крупные фреймворкиLaravel, Symfony, WordPressExpress, NestJS, Next.js
Один язык на фронте и бэкенетда

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

Что учить

JavaScript понадобится для любой интерактивной веб-страницы, потому что это единственный язык, который выполняют браузеры. Вопрос в том, что будет работать на сервере:

  • Учите PHP следующим, если хотите работать с WordPress, Laravel или множеством существующих PHP-сайтов, или если нужен самый простой способ разместить динамический сайт на недорогом хостинге. Начните с того, что такое PHP.
  • Оставайтесь с JavaScript (Node.js), если хотите один язык на весь стек или делаете функции реального времени.

Частый путь такой: HTML и CSS, потом JavaScript в браузере, потом один серверный язык. Какой бы серверный язык вы ни выбрали, формы, сессии, базы данных и JSON API работают на одних и тех же идеях HTTP, так что знания переносятся.

Часто задаваемые вопросы

Может ли JavaScript заменить PHP?

На сервере да: Node.js (с Express, Next.js и подобными) выполняет те же задачи, что и PHP. В браузере PHP не может заменить JavaScript совсем, потому что браузеры выполняют только JavaScript. Поэтому многие сайты используют PHP или Node на сервере и JavaScript в браузере.

Как передать переменную PHP в JavaScript?

Выведите её в страницу как JSON: <script>const user = <?= json_encode($user, JSON_HEX_TAG) ?>;</script>. json_encode выдаёт корректный JavaScript для строк, чисел, массивов и объектов, а JSON_HEX_TAG не даёт </script> внутри данных закрыть тег.

Может ли JavaScript вызвать функцию PHP?

Напрямую нет, потому что PHP выполняется на сервере, а JavaScript в браузере. JavaScript отправляет HTTP-запрос через fetch('/api.php?id=3'), PHP-скрипт выполняется и печатает ответ (обычно JSON), а JavaScript его читает.

PHP быстрее Node.js?

Зависит от нагрузки. Node.js хорошо держит много одновременных медленных соединений (чаты, веб-сокеты) благодаря циклу событий. PHP 8 с OPcache быстр на обычных страницах вида запрос и ответ. Для большинства сайтов узкое место это база данных, а не язык.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ