PHP и Node.js — это два стандарта кодирования, созданные для веб-целей. Node.js не является самостоятельным языком, это новая реализация Javascript и другая философия в программировании.
PHP перенял некоторые особенности Node, такие как менеджер пакетов NPM на Composer и асинхронность, которая делает основную часть некоторых фреймворков, таких как Laravel.
. Node.js с помощью библиотек может делать почти то же самое, что и полноценные языки вроде Python. Новый Electron.JS для настольных приложений использует Node за кулисами. Это основа для некоторых приложений, таких как VS Code или настольный клиент Spotify. PHP не предназначен для настольных систем, и он остается закрытым в тех же целях с тех пор, как был создан в 1995 году Расмусом Лердорфом.
Используя автономный сервер node, предоставляемый модулем http и PHP-клиентом FastCGI, можно обслуживать PHP-файлы изнутри node. Позвольте мне показать, как это делается.
PHP 5.4 представил новый автономный встроенный веб-сервер в PHP, его можно заставить сервер node проксифицировать запросы и ответы PHP, но это не то, что мы делаем здесь.
FastCGI был представлен, чтобы добавить гибкость и стандартизацию к тому, что было множеством способов, которыми обычные двоичные среды исполнения, такие как bash, могли обслуживать веб-страницы. До появления PHP такие языки, как Perl, использовались для создания динамического веб-контента.
Для некоторых веб-серверов, которые не имеют доступа через общую библиотеку, PHP-CGI (в Linux PHP-FPM, от FastCGI PHP Manager) — это способ сделать это. Передний веб-сервер получает запрос на PHP-скрипт и делает запрос к PHP CGI-клиенту, включая такие детали, как имя веб-скрипта, строковый запрос и возможное тело запроса. CGI-клиент отвечает HTML или другим форматом, выводимым из PHP.
Nginx и Lighttpd используют этот способ для сервера веб-контента PHP, NodeJS также может взаимодействовать с FastCGI через модуль node php-fpm.
Код выглядит следующим образом:
const phpFpm = require ('php-fpm');
const php = phpFpm({
host: '127.0.0.1',
port: 9123,
documentRoot: __dirname + '\www',
});
Клиент PHP CGI должен уже прослушивать порт 9123 и быть запущен с помощью args: php-cgi -b 127.0.0.1:9123
. В Linux это php-fpm
и args должны быть такими же, но я не пробовал.
Здесь корень моего документа находится в поддиректории в корне проекта. Я делаю это потому, что использую конфигурационные файлы в корне и в каталоге conf. Веб-посетители не могут иметь к ним доступ.
Назовите файл server.js
, запустите веб-сервер node с помощью node server.js
, в корневом каталоге по адресу www/
вы можете иметь следующий PHP-код:
<?php
echo "<H1>Hello, today's date is " . date("Y-m-d") . " and more!</H1>";
Назовите этот файл index.php
, сохраните его на www
, и если вы перейдете по адресу http://localhost:3000/index.php, то увидите нечто подобное:
Полный код server.js
приведен ниже:
const http = require ('http');
const fs = require ('fs');
const phpFpm = require ('php-fpm');
const php = phpFpm({
host: '127.0.0.1',
port: 9123,
documentRoot: __dirname + '\www',
debug: false
});
const server = http.createServer((req, res) => {
let url = req.url;
let method = req.method;
console.log('Serving request: ' + method + ' ' + url );
if (url == '/') {
readAndServe('index.html', res);
} else if (url.endsWith('.php')) {
php(req,res);
} else {
readAndServe(url, res);
}
}).listen(3000, '127.0.0.1',function() {
let {address, port} = server.address();
console.log('Server started at '+ address+ ':'+ port);
});
// Helper function
function readAndServe(path, res) {
fs.readFile('www/' + path, function (err, data) {
if (err) {
console.error(err);
res.writeHead(404, { 'Content-Type': 'text/plain' });
data = '404 Not Foundn';
}
res.end(data);
});
}