Страница 3 из 4

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

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

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

Добавлено: 29 апр 2017, 19:15
xsash
Вы опрашиваете кого? 1wire сеть подключенную куда?

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

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

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

Добавлено: 29 апр 2017, 19:21
nihil777
А если опрашивать папку аларм? С какой частотой? Там могут быть события от датчиков протечки...

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

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

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

Добавлено: 29 апр 2017, 22:39
xsash
По расберри не подскажу, к сожалению, думал вы дергаете данные от меги или подобной системе, где данные отдаются "готовыми"

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

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

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

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

Добавлено: 28 май 2018, 10:20
Andrey_B
Сделайте тестовый скрипт с минимальным объемом кода, в котором бы воспроизводилась проблема, и покажите его.

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

Добавлено: 28 май 2018, 14:00
Lisasv
Вот в таком виде использую для отправки сообщений на модуль формирующий 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.
}
?>

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

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

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

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

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

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

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

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

тело скрипта

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

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

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

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

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

Добавлено: 29 май 2018, 18:15
xsash
А если

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

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

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

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

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

Добавлено: 29 май 2018, 22:07
Lisasv
xsash писал(а):
29 май 2018, 18:15
А если

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

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

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

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

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

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

Добавлено: 29 май 2018, 23:34
Andrey_B
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.

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

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

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

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

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