История перехода от статичного PHP к динамическому AJAX интерфейсу
Изначально моя IoT панель работала по простой схеме:
Пользователь → Запрос → PHP (вся логика) → HTML страница
Проблемы такого подхода:
Я разделил логику на две части:
Отвечает только за первоначальную отрисовку интерфейса:
<?php
// Только базовые данные для первой загрузки
$stmt = $pdo->query("SELECT ... FROM sensor_data ...");
$sensors = $stmt->fetchAll();
?>
<div id="sensor-panel">
<?php foreach ($sensors as $sensor): ?>
<div class="sensor-card" id="sensor-<?= base64_encode($sensor['topic']) ?>">
<div class="value"><?= $sensor['value'] ?></div>
<div class="timestamp"><?= $sensor['timestamp'] ?></div>
</div>
<?php endforeach; ?>
</div>
<script>
// JavaScript для динамического обновления
function updateSensors() {
fetch('/api/live_data.php')
.then(response => response.json())
.then(data => {
data.sensors.forEach(sensor => {
const element = document.getElementById('sensor-' + btoa(sensor.topic));
if (element) {
element.querySelector('.value').textContent = sensor.value;
element.querySelector('.timestamp').textContent = sensor.timestamp;
}
});
});
}
// Обновляем каждые 30 секунд
setInterval(updateSensors, 30000);
</script>
Легковесный скрипт только для данных:
<?php
header('Content-Type: application/json');
// Только необходимые данные для обновления
$stmt = $pdo->query("SELECT topic, value, timestamp FROM sensor_data ...");
$sensors = $stmt->fetchAll();
echo json_encode([
'sensors' => $sensors,
'current_time' => date('Y-m-d H:i:s')
]);
?>
// PHP: создаем уникальные ID
$sensor_id = 'sensor-' . base64_encode($topic);
// JavaScript: находим по ID
const element = document.getElementById('sensor-' + btoa(topic));
// Датчики движения - преобразуем 0/1 в текст
if ($type === 'presence') {
$display_value = ($value == '1') ? 'Движение есть' : 'Нет движения';
}
// Клапаны - добавляем кнопки управления
if ($type === 'valve') {
echo '<button onclick="sendCommand(\'' . $topic . '\', \'ON\')">ВКЛ</button>';
}
// Инициализация при загрузке
const chart = new Chart(ctx, {
type: 'line',
data: { labels: [], datasets: [{ data: [] }] }
});
// Отдельный AJAX для истории
fetch('/api/history.php?topic=' + topic)
.then(r => r.json())
.then(history => {
chart.data.labels = history.map(h => h.time);
chart.data.datasets[0].data = history.map(h => h.value);
chart.update();
});
// index.php - основная страница
<?php
$data = ['message' => 'Привет от PHP!', 'time' => date('H:i:s')];
?>
<div id="content">
<?= $data['message'] ?> <span id="time"><?= $data['time'] ?></span>
</div>
<button onclick="updateTime()">Обновить</button>
<script>
function updateTime() {
fetch('api.php')
.then(r => r.json())
.then(data => {
document.getElementById('time').textContent = data.time;
});
}
</script>
// api.php - endpoint для AJAX
<?php
header('Content-Type: application/json');
echo json_encode(['time' => date('H:i:s')]);
?>
Переход от чистого PHP к AJAX - это естественная эволюция веб-приложений. Даже простые проекты выигрывают от разделения логики и представления.
Главный совет: начинайте с гибридного подхода. Не нужно сразу переписывать всё на JavaScript фреймворки. Постепенное внедрение AJAX в существующие PHP проекты дает immediate benefits без полного переписывания.
Следующий шаг - возможно, Vue.js или React для более сложного frontend, но пока гибридный подход отлично справляется!
>
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!