тормозят выключатели из-за скрипта php
тормозят выключатели из-за скрипта php
Всем привет. Поставил датчик движения, посадил его на вход меги.
На сервере есть вот такой скрипт на php, который включает свет на несколько секунд $cnt_light
//включаем порт
while ($cnt<$cnt_light){
sleep(1);
$cnt++;
}
//выключаем порт
После этого стали тормозить выключатели, отвечающие за другое освещение. К примеру проходишь под датчиком движения, запускается скрипт. Если в этот момент нажать другой выключатель, то реакция будет лишь через секунду примерно.
С чем может быть связано такое поведение?
На сервере есть вот такой скрипт на php, который включает свет на несколько секунд $cnt_light
//включаем порт
while ($cnt<$cnt_light){
sleep(1);
$cnt++;
}
//выключаем порт
После этого стали тормозить выключатели, отвечающие за другое освещение. К примеру проходишь под датчиком движения, запускается скрипт. Если в этот момент нажать другой выключатель, то реакция будет лишь через секунду примерно.
С чем может быть связано такое поведение?
Re: тормозят выключатели из-за скрипта php
Во всем виноват "sleep(1);". Во время выполнения "sleep(1);" сервер просто ничего не делает. Так что надо по-другому организовать код, чтобы тот код, где присутствует "sleep", запускался в самостоятельных процессах и не задерживал обработку другого кода.
Как сделать не подскажу (не программист).
Как сделать не подскажу (не программист).
Re: тормозят выключатели из-за скрипта php
Вы не привели код включения/выключения порта.
Если это делается с помощью функции file_get_contents(), то просто добавьте:
flush();
в начале скрипта.
Если это делается с помощью функции file_get_contents(), то просто добавьте:
flush();
в начале скрипта.
Re: тормозят выключатели из-за скрипта php
да. делаю через file_get_contents(), правда своим классом и методами.
flush() в начале скрипта ничего не дал.
Скрипт включения по датчику движения вызываю из основного скрипта с помощью exec, поэтому не должно бы sleep() влиять на выполнение всего остального.
И еще заметил, что свет по выключателю тормозит только один раз, т.е. сработал датчик движения->включился свет, нажали другой выключатель - произошла пауза, потом включился свет. Если еще раз нажимать другой выключатель пока цикл работает, то всё в порядке, срабатывает моментально.
Я вот думаю может ли быть такое, что притормаживает из-за того, что датчик движения некоторое время держит замкнутым порт меги? И именно в этот момент происходит притормаживание.
flush() в начале скрипта ничего не дал.
Скрипт включения по датчику движения вызываю из основного скрипта с помощью exec, поэтому не должно бы sleep() влиять на выполнение всего остального.
И еще заметил, что свет по выключателю тормозит только один раз, т.е. сработал датчик движения->включился свет, нажали другой выключатель - произошла пауза, потом включился свет. Если еще раз нажимать другой выключатель пока цикл работает, то всё в порядке, срабатывает моментально.
Я вот думаю может ли быть такое, что притормаживает из-за того, что датчик движения некоторое время держит замкнутым порт меги? И именно в этот момент происходит притормаживание.
Re: тормозят выключатели из-за скрипта php
Это код, который вызывается с меги при срабатывании датчика, в данном случае этот скрипт запускает exec("cd custom_scripts && php -f penetration.php &") , который ниже
Это скрипт, который запускается из предыдущего скрипта, тут функция set(27,1, 1) устанавливает значение порту
На меге порт в режиме P.
Кстати, в режиме P&R и R все работает четко, задержки нет
Код: Выделить всё
require_once '../include.php';
/* Определяем какой мегадевайс вызвал скрипт */
$ip_device = $_SERVER['REMOTE_ADDR'];
$pt = $_GET['pt']; //Получаем номер входного порта, котоырй активировал скрипт
$state = file_get_contents("http://$ip_device/sec/?pt=$pt&cmd=get"); //Получаем состояние порта, который активировал скрипт
$state = explode('/',$state);
Megad::$ip_device = $ip_device;
$mega = new Megad();
$port = $mega->get($pt); //взяли номер порта, который сработал - нашли нужный порт в таблице портов
if ($port->easy!=null)
{ // Выполняем простое действие, указанное в easy
echo $port->easy;
}
elseif ($port->script!=null) {
[b] exec("cd custom_scripts && php -f penetration.php &"); //выполняем внешний скрипт[/b]
}
else{ // Выполняем внешний скрипт, который находим по объекту и его методу
if($port->object!=null)
{
$script = new Scripts();
$script->runscript($port->object, $port->method, $state[0]);
}
}
//Меняем состояние связанного итема
$view = new Views();
$view->update_item($port->object, $state);
Это скрипт, который запускается из предыдущего скрипта, тут функция set(27,1, 1) устанавливает значение порту
Код: Выделить всё
require_once '../../include.php';
$cnt_light = 15; //интервал включения освещения, сек.
$script = new Scripts();
$script->set(27,1, 1);
while ($cnt<$cnt_light){
sleep(1);
$cnt++;
}
$script->set(27,0, 1);
Кстати, в режиме P&R и R все работает четко, задержки нет
Re: тормозят выключатели из-за скрипта php
Может именно в этом все дело, что порт работает в режиме "P". Как правило, датчики движения работают, размыкая сигнальную цепь. Соответственно, если порт для датчика установлен в режиме "P", то будет задержка запуска скрипта, поскольку сначала произойдет размыкание ("R"), и только через некоторый промежуток времени -- замыкание порта ("P").
Это я к тому, что для таких датчиков режим работы порта должен быть "R".
Re: тормозят выключатели из-за скрипта php
Нет, датчик именно замыкает порт. Там стоит HC-SR501 с транзисторным ключом на bs170.
И тормозит включение света не того, что заведено на датчик, а другого: т.е. есть две лампочки, одна включается от датчика, другая от выключателя. Если датчик сработал - первая лампочка включается моментально. Жмем выключатель, проходит секунда и после этого только загорается вторая лампочка. Если потом нажимать выключатель пока работает скрипт, то все работает быстро без задержек. Т.е. задержка только при первом нажатии на кнопку выключателя
И тормозит включение света не того, что заведено на датчик, а другого: т.е. есть две лампочки, одна включается от датчика, другая от выключателя. Если датчик сработал - первая лампочка включается моментально. Жмем выключатель, проходит секунда и после этого только загорается вторая лампочка. Если потом нажимать выключатель пока работает скрипт, то все работает быстро без задержек. Т.е. задержка только при первом нажатии на кнопку выключателя
Re: тормозят выключатели из-за скрипта php
Проверить ваш код не представляется возможным, так как отсутствует "include.php".
Я предлагаю сделать иначе. Сделайте какой-то упрощенный скрипт (скрипты), который бы у вас точно воспроизводил проблему, и пришлите его.
Я предлагаю сделать иначе. Сделайте какой-то упрощенный скрипт (скрипты), который бы у вас точно воспроизводил проблему, и пришлите его.
Re: тормозят выключатели из-за скрипта php
что-то кажется мне, что дело не в скриптах, ведь в режиме P&R работает нормально без задержек. Вот вариант скрипта с этим режимом. Всё отличие, что в данном случае мы проверяем как был вызван скрипт при "включении" порта или при "выключении". Может прошивка меги старая? У меня fw: 4.07b2
Код: Выделить всё
require_once '../../include.php';
$cnt_light = 5; //интервал включения освещения, сек.
$script = new Scripts();
$st = $script->status(11,'get',1);
$status = explode('/',$st);
//Включаем свет
if ($status[0]=='ON'){
$script->set(27,1, 1);
while ($cnt<$cnt_light){
$st = $script->status(11,'get',1);
$status = explode('/',$st);
if ($status[0]=='ON') $cnt=0;
sleep(1);
$cnt++;
}
$script->set(27,0, 1);
}
Re: тормозят выключатели из-за скрипта php
Мы так долго можем гадать: может прошивка, может не прошивка.
Сделайте код, который у вас воспроизводит описанную проблему, и который я могу запустить у себя.
Тогда я точно смогу сказать, в чем причина.
Сделайте код, который у вас воспроизводит описанную проблему, и который я могу запустить у себя.
Тогда я точно смогу сказать, в чем причина.
Re: тормозят выключатели из-за скрипта php
exec не форкает процесс, так что имеет полное право тормозить основной скрипт... Есть несколько рецептов решения таких вот фоновых задач с кастомными задержками, рекомендую изучить вот эту простыню: https://stackoverflow.com/questions/459 ... nd-process
особое внимание обратив на готовое решение с proc_open внизу и решение с "&" где-то в середине
особое внимание обратив на готовое решение с proc_open внизу и решение с "&" где-то в середине
Re: тормозят выключатели из-за скрипта php
Спасибо, почитаю. Может и нефоркает, но я опирался на сатью https://habr.com/post/278755/ , где указано, что с амперсандом в конце именно так и работает как мне надо. И оно в принципе работает, если порт в состоянии P&R. Будет время - сделаю простой скрипт для проверки.alex946 писал(а): ↑12 дек 2018, 21:41exec не форкает процесс, так что имеет полное право тормозить основной скрипт... Есть несколько рецептов решения таких вот фоновых задач с кастомными задержками, рекомендую изучить вот эту простыню: https://stackoverflow.com/questions/459 ... nd-process
особое внимание обратив на готовое решение с proc_open внизу и решение с "&" где-то в середине