FAQ php, MySQL, bash и т.д.

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
nihil777
Сообщения: 38
Зарегистрирован: 22 сен 2011, 22:09

Re: FAQ php, MySQL, bash и т.д.

Сообщение nihil777 » 29 апр 2017, 18:42

Добрый день. Подскажите, пожалуйста, как на php правильнее организовать опрос 1-wire сети?
Если циклом типа while (true), то как проверять, работает ли он. Как если что остановить его? Не остановит ли его сам php допустим через сутки?
Или правильнее кроном? Но тогда с какой периодичностью?

xsash
Сообщения: 190
Зарегистрирован: 08 авг 2016, 12:27

Re: FAQ php, MySQL, bash и т.д.

Сообщение xsash » 29 апр 2017, 19:15

Вы опрашиваете кого? 1wire сеть подключенную куда?

У php сценариев есть лимит времени на работу, задается в php.ini
Лимит вроде не учитывается при запуске php скриптов из консоли

Опрашивать, имхо, лучше по крону. Частота - зависит от ваших желаний и ТЗ. Для теплых полов, думаю, будет норм раз в минуту

nihil777
Сообщения: 38
Зарегистрирован: 22 сен 2011, 22:09

Re: FAQ php, MySQL, bash и т.д.

Сообщение nihil777 » 29 апр 2017, 19:21

А если опрашивать папку аларм? С какой частотой? Там могут быть события от датчиков протечки...

nihil777
Сообщения: 38
Зарегистрирован: 22 сен 2011, 22:09

Re: FAQ php, MySQL, bash и т.д.

Сообщение nihil777 » 29 апр 2017, 19:24

1wire подключена к Raspberry пока через 4pin. Потом подключу через usb-адаптер.
На шине будут 10 датчиков температуры, 4 DS2408 и штук 20 DS2406. Хочу сделать опрос папки alarm и по факту появления - действия.

xsash
Сообщения: 190
Зарегистрирован: 08 авг 2016, 12:27

Re: FAQ php, MySQL, bash и т.д.

Сообщение xsash » 29 апр 2017, 22:39

По расберри не подскажу, к сожалению, думал вы дергаете данные от меги или подобной системе, где данные отдаются "готовыми"

Но на расберри использовал либо перл, либо баш по крону

Lisasv
Сообщения: 14
Зарегистрирован: 04 янв 2015, 22:05
Откуда: Тюм. обл.,г.Заводоуковск
Контактная информация:

Re: FAQ php, MySQL, bash и т.д.

Сообщение Lisasv » 27 май 2018, 22:49

Добрый день.Давно не могу решить проблему, нигде не нашёл ответа. В моём Умном доме использую ПК на Windows,
как сердце системы.В доме на сегодня с ним работают девять разных модулей.Написал софт на PHP и MySQL(скрипты).
Проблема такая- команды с сервера на модули посылаю так(пример): file_get_contents("http: //192.168.0.10/?SVET1=ON").
Так вот, если перед командой file_get_contents(), что-нибудь писать в таблицу MySQL, то происходит некоторая задержка записи в таблицу.
Как будто file_get_contents() имеет приоритет и мешает оперативно делать записи в таблицы, хотя в скрипте операция записи
стоит ранее, чем команда file_get_contents(). Может кто направит меня на путь истинный? Сам я не так давно занялся PHP.

Andrey_B
Администратор
Сообщения: 3655
Зарегистрирован: 18 мар 2011, 12:06

Re: FAQ php, MySQL, bash и т.д.

Сообщение Andrey_B » 28 май 2018, 10:20

Сделайте тестовый скрипт с минимальным объемом кода, в котором бы воспроизводилась проблема, и покажите его.

Lisasv
Сообщения: 14
Зарегистрирован: 04 янв 2015, 22:05
Откуда: Тюм. обл.,г.Заводоуковск
Контактная информация:

Re: FAQ php, MySQL, bash и т.д.

Сообщение Lisasv » 28 май 2018, 14:00

Вот в таком виде использую для отправки сообщений на модуль формирующий SMS.

<?php // Скрипт для отправки СМС.

$Read_ini = parse_ini_file("home7.ini");

$db_host = $Read_ini['host'];
$db_name = $Read_ini['base'];
$db_username =$Read_ini['username'];
$db_password = $Read_ini['password'];

$table_st = 'voda_st';
// текстовый файл WriteToFile_sobit_tm для сбора сообщений
$connect_to_db = mysql_connect($db_host, $db_username, $db_password) or die(WriteToFile_sobit_tm(mysql_error()));

mysql_select_db($db_name, $connect_to_db) or die(WriteToFile_sobit_tm(mysql_error()));

$qr_result = mysql_query("select * from " . $table_st) or die(WriteToFile_sobit_tm(mysql_error() ));
$stopor_sms= mysql_fetch_array ($qr_result) ;

if ($stopor_sms[0]==0) //слежу, чтобы не было попытки многократной отправки СМС
{ //потому что модули могут несколько раз прислать команду запуска скрипта.

// записываю метку(блокировка).
mysql_query( " UPDATE $table_st SET stopor_sms='1'") or die(WriteToFile_sobit_tm(mysql_error() ));

file_get_contents("http://192.168.0.10/?GSM_SMS_TEL=+79028 ... XT=Message"); // команда на GSM Modem(модуль) для отправки SMS
//бывает, что СМС может много раз прийти, хотя уже всё заблокировано должно быть.
//путем проб заметил, что если file_get_contents() отключить, то запись в таблицу проходит сразу без задержки,
//как будто он подтормаживает запись в MySQL.
}
?>

Andrey_B
Администратор
Сообщения: 3655
Зарегистрирован: 18 мар 2011, 12:06

Re: FAQ php, MySQL, bash и т.д.

Сообщение Andrey_B » 28 май 2018, 14:49

Очевидных причин "подтормаживания" MySQL в коде не видно. Возможно, дело в железе, сбоях при записи данных на накопитель, особенно если все это работает на мини-ПК с microSD.
Хотя возникает вопрос, а нужен ли здесь MySQL или проще использовать файл блокировки (touch(); if ( file_exists()); unlink())?

Lisasv
Сообщения: 14
Зарегистрирован: 04 янв 2015, 22:05
Откуда: Тюм. обл.,г.Заводоуковск
Контактная информация:

Re: FAQ php, MySQL, bash и т.д.

Сообщение Lisasv » 28 май 2018, 15:14

Спасибо за подсказку, я тоже уже от безисходности начал смотреть в сторону от MySQL для таких ситуаций.
Раньше думал, что MySQL универсальное решение, набираюсь опыта.
В виде сервера стоит MB mITX Intel N3050 1.6ггц/SSD 60гб Win10, неплохо работает, не сильно греется и использую OpenServer.
ТимВиев хорошо на ней живёт. Причём это уже другая MB(стоял DENWER), предыдущая была мощнее и ела больше под Win7, но проблема
была такая-же.В модуле GSM modem использую stm32f103rbt/W5500, правда пишу скетчи под Arduino-STM IDE.
Хотя всё остальное работает неплохо.

Lisasv
Сообщения: 14
Зарегистрирован: 04 янв 2015, 22:05
Откуда: Тюм. обл.,г.Заводоуковск
Контактная информация:

Re: FAQ php, MySQL, bash и т.д.

Сообщение Lisasv » 29 май 2018, 15:54

Наверное нашёл причину такого "странного" поведения скрипта.
У меня один главный PHP скрипт который модули "дёргают" своими запросами.
В сети несколько модулей, и они передают много разной телеметрии.
Случается так, что скрипт запускается в одну секунду несколькими модулями,
а так как file_get_contents() команда небыстрая, в одну секунду главный скрипт может
быть запущен одновременно два, три и больше раз.
Задался вопросом, как блокировать скрипт от одновременных множественных запусков,
но и не потерять.
Нашёл такое:

<?php
$fp = fopen("/tmp/lock.txt", "w+");

if (flock($fp, LOCK_EX)) // выполнить эксплюзивное запирание

тело скрипта

flock($fp, LOCK_UN); // отпираем файл
fclose($fp);
?>

Но боюсь что, во время работы первой копии другие запуски скрипта пропадут,
так как упрутся в блокировку.
Как все-же правильно решить такую задачу?

Andrey_B
Администратор
Сообщения: 3655
Зарегистрирован: 18 мар 2011, 12:06

Re: FAQ php, MySQL, bash и т.д.

Сообщение Andrey_B » 29 май 2018, 17:38

В начале скрипта делаете проверку на наличие файла "блокировки".
Если файл присутствует, то ждем секунду и снова проверяем. И так в течение минуты. Если через минуту файл все еще присутствует, скорее всего, был какой-то сбой и файл просто не удалился, удаляем файл и выполняем код.
Зачем эти сложности с fopen() flock()? В предыдущем сообщении я привел пример. Просто создаем файл touch() и просто удаляем его в конце скрипта unlink(). Просто и надежно.

xsash
Сообщения: 190
Зарегистрирован: 08 авг 2016, 12:27

Re: FAQ php, MySQL, bash и т.д.

Сообщение xsash » 29 май 2018, 18:15

А если

1) заменить file_get_contents на cURL (multi_curl)

2) вам для каких целей дергать данные из меги с разных мест? т.е. какая стоит цель перед алгоритмом?
может есть возможность оптимизировать все алгоритмы и свети к тому, чтобы раз в минуту (полминуты, т.е. время которое не будет превышать критический показатель актульаности) дергать данные одним скриптом и писать в базу mysql, а уже все остальные скрипты брали бы данные уже оттуда.
разгрузится и сеть и модули

Lisasv
Сообщения: 14
Зарегистрирован: 04 янв 2015, 22:05
Откуда: Тюм. обл.,г.Заводоуковск
Контактная информация:

Re: FAQ php, MySQL, bash и т.д.

Сообщение Lisasv » 29 май 2018, 21:45

Andrey_B писал(а):
29 май 2018, 17:38
Зачем эти сложности с fopen() flock()? В предыдущем сообщении я привел пример. Просто создаем файл touch() и просто удаляем его в конце скрипта unlink(). Просто и надежно.
Признаюсь, не сразу разобрался в простоте этой конструкции.Действительно удобнее и меньше кода, чем с fopen() и flock(), спасибо.Только не знаю, как повлияет это на SSD с постоянными удалениями файла.Но если это всё будет в кеше RAMа, то не страшно.

Lisasv
Сообщения: 14
Зарегистрирован: 04 янв 2015, 22:05
Откуда: Тюм. обл.,г.Заводоуковск
Контактная информация:

Re: FAQ php, MySQL, bash и т.д.

Сообщение Lisasv » 29 май 2018, 22:07

xsash писал(а):
29 май 2018, 18:15
А если

1) заменить file_get_contents на cURL (multi_curl)
интересная конструкция, нашёл по ней информацию, изучаю
xsash писал(а):
29 май 2018, 18:15
2) вам для каких целей дергать данные из меги с разных мест? т.е. какая стоит цель перед алгоритмом?
может есть возможность оптимизировать все алгоритмы и свети к тому, чтобы раз в минуту (полминуты, т.е. время которое не будет превышать критический показатель актульаности) дергать данные одним скриптом и писать в базу mysql, а уже все остальные скрипты брали бы данные уже оттуда.
разгрузится и сеть и модули
Дело в том, что у меня большой частный дом.Но даже в нём нет места под большой узел, куда бы вели толстые пучки проводов.А так стоят локально пока 9 модулей по своим углам и по Ethernet шлют на сервер свои запросы, а получают свои ответы.Ламп пока около 50, хозпостройки, баня, теплица, подвалы. Датчиков протечки около десятка.Планы по управлению питанием розеток, около 20шт.Датчики охрана/пожарка.Это ещё далеко не всё. Планов море. Многое уже воплотил.С утра бывает ещё что-нибудь придёт в голову.В своём доме нет границ.Сводить это всё в один шкаф не стал.

xsash
Сообщения: 190
Зарегистрирован: 08 авг 2016, 12:27

Re: FAQ php, MySQL, bash и т.д.

Сообщение xsash » 29 май 2018, 22:46

Эх, с одной стороны конечно завидую, но с другой сочувствую, когда нет четкого плана и схемы, а так же центрального узла придется костыли изобретать

Burst
Сообщения: 35
Зарегистрирован: 25 янв 2018, 13:22
Откуда: Балашиха

Re: FAQ php, MySQL, bash и т.д.

Сообщение Burst » 29 май 2018, 23:21

xsash писал(а):
29 май 2018, 22:46
Эх, с одной стороны конечно завидую, но с другой сочувствую, когда нет четкого плана и схемы, а так же центрального узла придется костыли изобретать
Децентрализованная схема тоже имеет право на жизнь, у меня например центральный только шкаф для Ethernet подключений, а щитки по одному на этаж. Так намного удобней и проще, иначе в центре был бы просто гигантский щит и куча проводов.

Andrey_B
Администратор
Сообщения: 3655
Зарегистрирован: 18 мар 2011, 12:06

Re: FAQ php, MySQL, bash и т.д.

Сообщение Andrey_B » 29 май 2018, 23:34

Lisasv писал(а):
29 май 2018, 21:45
Только не знаю, как повлияет это на SSD с постоянными удалениями файла.Но если это всё будет в кеше RAMа, то не страшно.
Можно подстраховаться и создать RAM Disk. В Windows для этого есть много программ.
В Linux проще - там есть и ramfs и tmpfs.
Кроме того, в PHP есть такая штука как разделяемая память (shmop). В принципе, наверное, то, что надо.
http://php.net/manual/ru/book.shmop.php
Еще есть Alternative PHP Cache.

xsash
Сообщения: 190
Зарегистрирован: 08 авг 2016, 12:27

Re: FAQ php, MySQL, bash и т.д.

Сообщение xsash » 30 май 2018, 08:16

Burst писал(а):
29 май 2018, 23:21
Децентрализованная схема тоже имеет право на жизнь, у меня например центральный только шкаф для Ethernet подключений, а щитки по одному на этаж. Так намного удобней и проще, иначе в центре был бы просто гигантский щит и куча проводов.
Ну в принципе это нормально, вспомните даже картинки из сети серверных, или на ютубе как собирают шкафы под модули умного дома на сименс.

Но я чуть не о том, и вероятно или меня, или я не допонял вас. Неважно сколько мег/других контролеров у вас в сети и где они располагаются. Они же в общей сетке? Почему не поставить 1 сервер (комп, одноплатник, прочее). Сейчас то как все и кем разруливается? Где логика дома то живет?

Lisasv
Сообщения: 14
Зарегистрирован: 04 янв 2015, 22:05
Откуда: Тюм. обл.,г.Заводоуковск
Контактная информация:

Re: FAQ php, MySQL, bash и т.д.

Сообщение Lisasv » 30 май 2018, 08:43

Модули сами по себе самодостаточны, они могут управлять освещением, другими нагрузками, у них свои кнопки.Сервер стоит над ними всеми и добавляем им ума.Различные хитрые сценарии, это всё на нём.Он же аккумулирует всю телеметрию со всех модулей.Посылка статистики на мессенджер или емаил. К примеру уехал надолго из дома, создал сценарий на сервере, чтобы он включал освещение.Будем имитация присутствия.Поправить скрипт на сервере намного проще, чем править прошивку на модуле.Система становится гибче.

Ответить