У меня есть веб-сервер LAMP со скриптом Python, постоянно отслеживающий последовательный порт для входящих данных. Это часть системы домашней автоматизации (с Arduino Yun и группой Pro Minis, каждая с радиочастотными трансиверами nrf24L01 +).
Мои цели:
Я понимаю, что могу использовать AJAX, но отправка данных кажется лучше, чем опрос. Проблема заключается в том, что мне нужно каким-то образом передавать связанные с SSE данные из скрипта python в PHP, но только когда PHP-скрипт SSE работает. Кроме того, я считаю, что новый экземпляр скрипта SSE PHP создается с каждым клиентом — поэтому даже не будет соотношения 1: 1 для Python и PHP. Я думал о том, чтобы SSE PHP следил за базой данных MySQL, но это по сути дела назад к опросу, хотя, вероятно, очень высокочастотному опросу.
В качестве альтернативы я думал, что скрипт SSE PHP может контролировать последовательный порт, но я думаю, что последовательные данные могут быть прочитаны только один раз, поэтому несколько скриптов будут конкурировать за данные, что также не будет работать.
Каков наилучший способ достижения этих двух целей — сохранение входящих данных в моей базе данных и использование SSE в качестве транспортного уровня?
Итак, вот что я в итоге сделал:
Я решил, что 3-секундное время обновления сценария Server Sent было достаточно для моих нужд. Теоретически он может работать непрерывно, но, вероятно, затопит веб-страницу и снизит производительность. Сценарий также может быть настроен на запуск каждую 1 секунду — возможно, я сделаю это обновление когда-нибудь.
…В любом случае, вот как я это сделал, никаких веб-сокетов не требуется! Я также думаю, что это более элегантно, чем зависший запрос AJAX.
Из того, что я понимаю о SSE, проблема в том, что долго работающий PHP-скрипт распознает изменения, которые Python-скрипт внесет в базу данных.
Предположим, что ваш скрипт Python правильно добавляет данные в базу данных MySQL.
Тогда ваш PHP-скрипт просто соберет данные и отправит их через SSE. Вы хотели бы длительный сценарий, но вы также хотите посмотреть на время ожидания для ваших сценариев PHP используя set_time_limit () как определено на php.net.
Я бы попробовал что-то вроде этого:
$link = mysqli_connect("myhost","myuser","mypassw","mybd");
$number_of_times = 1;
/*
* Ideally figure out how many times you want to query per consistent
* connection, knowing that your script will eventually time out and
* that EventSource will reconnect within 3 seconds
*/
for ($i=0;$i<$number_of_times;$i++) {
$query = "SELECT name FROM mytable" or die("Error in query: " . mysqli_error($link));
$result = $link->query($query);
while($row = mysqli_fetch_array($result)) {
// echo your SSE data here
}
}
Вас не беспокоит то, что для ваших сценариев это соотношение не равно 1: 1, поскольку веб-страница, использующая EventSource, подключится к сценарию PHP, а сценарий Python отслеживает другой источник входящих данных и записывает его в общую базу данных, которая одновременно скрипты будут использовать.
Кроме того, читайте о лимитах для EventSource