Зачем PHP в мире "железа"? Разрушаем стереотипы
Когда слышишь "embedded разработка", первое, что приходит на ум — это Си, ассемблер, возможно MicroPython. PHP? Язык для веба, который работает на сервере и генерирует HTML. Какое отношение он имеет к микроконтроллерам, датчикам и прошивкам?
На самом деле — самое прямое. PHP давно перерос рамки "скриптового языка для форумов". Современные интерпретаторы (начиная с PHP 7+) могут работать на ARM-архитектурах, а для embedded-сред существует несколько интересных решений. Эта статья — не академический доклад, а живой гайд о том, как PHP может стать вашим помощником в мире встраиваемых систем. Мы разберем реальные кейсы, напишем код и посмотрим, где это действительно удобно.
Когда PHP — это разумный выбор для embedded?
Не путайте "микроконтроллер с 2 КБ RAM" и "одноплатный компьютер на Linux". PHP не запустится на ATmega328P (Arduino Uno) — для этого есть C/C++. Но если ваше устройство работает на:
- ESP32 (ESP-IDF или esp8266 с RTOS);
- Raspberry Pi (или аналоги на Allwinner, Rockchip);
- OpenWrt-маршрутизаторах с MIPS/ARM;
- Промышленных контроллерах на Linux.
…то PHP может стать идеальным "клеем" между вашим железом и внешним миром. Особенно, если нужно быстро сделать веб-интерфейс для управления устройством, парсить данные с датчиков или отправлять их в облако.
Как запустить PHP на микроконтроллере? Реальные варианты
Есть два основных подхода, и мы рассмотрим оба с примерами кода.
1. PHP на ESP32 с помощью ESP-IDF (Native PHP)
Да-да, существуют проекты, которые портируют интерпретатор PHP на bare-metal микроконтроллеры. Самый известный — PHP for ESP32 (экспериментальный форк). Урезанная версия языка без многопоточности, но с базовым синтаксисом, массивами, строками и GPIO.
Пример: мигаем светодиодом с помощью PHP на ESP32
<?php
// Подключаем библиотеку для работы с пинами
require "gpio.php";
// Настраиваем GPIO2 (встроенный LED на многих ESP32) как выход
$pin = new GPIO(2, GPIO::OUTPUT);
while (true) {
$pin->write(GPIO::HIGH);
delay(1000); // 1 секунда
$pin->write(GPIO::LOW);
delay(1000);
}
?>
Код выглядит знакомо, правда? Это не шутка — такой проект существует в репозиториях GitHub. Конечно, производительность ниже, чем на C, но для прототипирования — отлично.
2. PHP как "серверная прослойка" на Linux-совместимых SBC
Это самый практичный сценарий. Вы берете Raspberry Pi или Orange Pi, ставите обычный PHP (например, php8.3-cli) и используете его для:
- Чтения данных с GPIO через
gpiodилиwiringPi; - Работы с I2C/SPI-датчиками (температура, влажность, давление);
- Создания REST API для управления устройством.
Пример: читаем температуру с DHT22 через PHP на Raspberry Pi
<?php
// Используем shell-команду для чтения данных (через pigpio)
$output = shell_exec('pigs in 17'); // GPIO17
if ($output === false) {
die("Ошибка чтения датчика");
}
// Парсим и выводим
$data = explode(" ", trim($output));
$humidity = $data[0] / 10;
$temperature = $data[1] / 10;
echo "Температура: {$temperature}°C, Влажность: {$humidity}%\n";
?>
Можно пойти дальше и обернуть это в веб-сервер:
<?php
// api.php - простой REST endpoint
header('Content-Type: application/json');
$temperature = readSensor(); // ваша функция
echo json_encode([
'status' => 'ok',
'temp' => $temperature,
'timestamp' => time()
]);
?>
Запускаем: php -S 0.0.0.0:8080 api.php — и у вас готов IoT-шлюз!
Практические кейсы: где PHP выигрывает у C и Python
Давайте честно: для embedded-разработки PHP — не основной инструмент. Но в некоторых задачах он дает фору:
Кейс 1: Быстрый веб-интерфейс для умного дома
Представьте: у вас ESP32 управляет реле, и нужно сделать панель управления. На C вы будете писать HTTP-сервер с нуля или использовать тяжелый ESPAsyncWebServer. На PHP (даже на ESP32 через интерпретатор) вы просто:
<?php
$relayState = $_GET['state'] ?? 'off';
if ($relayState === 'on') {
GPIO::write(4, GPIO::HIGH);
} else {
GPIO::write(4, GPIO::LOW);
}
echo "Relay is now " . $relayState;
?>
Время разработки — 10 минут. Никаких структур, никаких таймеров.
Кейс 2: Обработка логов и метрик на шлюзе
Пусть Raspberry Pi собирает данные с десятка датчиков. PHP-скрипт раз в минуту парсит логи, агрегирует и отправляет в InfluxDB или просто пишет в CSV:
<?php
$logFile = '/var/log/sensors.log';
$lines = file($logFile, FILE_IGNORE_NEW_LINES);
$sum = 0;
$count = 0;
foreach ($lines as $line) {
if (preg_match('/TEMP:([\d\.]+)/', $line, $m)) {
$sum += (float)$m[1];
$count++;
}
}
$avg = $count > 0 ? $sum / $count : 0;
file_put_contents('/tmp/average_temp.txt', $avg);
?>
Просто, надежно, без лишних зависимостей.
Инструментарий: что нужно установить
Для старта в embedded-разработке с PHP вам понадобится:
- PHP CLI (версия 8.1+ для лучшей производительности);
- Composer — для библиотек вроде
php-serial(работа с COM-портами); - pigpio (для Raspberry Pi) или
libgpiod; - PHP-расширение для MQTT (например,
php-mqtt/client) — для IoT-протоколов.
Пример установки на Raspberry Pi OS:
sudo apt update
sudo apt install php8.3-cli php