тормозят выключатели из-за скрипта php

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Ответить
kinord
Сообщения: 99
Зарегистрирован: 24 фев 2012, 10:08

тормозят выключатели из-за скрипта php

Сообщение kinord » 11 дек 2018, 21:25

Всем привет. Поставил датчик движения, посадил его на вход меги.
На сервере есть вот такой скрипт на php, который включает свет на несколько секунд $cnt_light


//включаем порт
while ($cnt<$cnt_light){
sleep(1);
$cnt++;
}
//выключаем порт

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

С чем может быть связано такое поведение?

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: тормозят выключатели из-за скрипта php

Сообщение Ruslan » 11 дек 2018, 21:35

Во всем виноват "sleep(1);". Во время выполнения "sleep(1);" сервер просто ничего не делает. Так что надо по-другому организовать код, чтобы тот код, где присутствует "sleep", запускался в самостоятельных процессах и не задерживал обработку другого кода.
Как сделать не подскажу (не программист).

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

Re: тормозят выключатели из-за скрипта php

Сообщение Andrey_B » 11 дек 2018, 21:37

Вы не привели код включения/выключения порта.
Если это делается с помощью функции file_get_contents(), то просто добавьте:
flush();
в начале скрипта.

kinord
Сообщения: 99
Зарегистрирован: 24 фев 2012, 10:08

Re: тормозят выключатели из-за скрипта php

Сообщение kinord » 12 дек 2018, 08:39

да. делаю через file_get_contents(), правда своим классом и методами.

flush() в начале скрипта ничего не дал.

Скрипт включения по датчику движения вызываю из основного скрипта с помощью exec, поэтому не должно бы sleep() влиять на выполнение всего остального.

И еще заметил, что свет по выключателю тормозит только один раз, т.е. сработал датчик движения->включился свет, нажали другой выключатель - произошла пауза, потом включился свет. Если еще раз нажимать другой выключатель пока цикл работает, то всё в порядке, срабатывает моментально.

Я вот думаю может ли быть такое, что притормаживает из-за того, что датчик движения некоторое время держит замкнутым порт меги? И именно в этот момент происходит притормаживание.

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

Re: тормозят выключатели из-за скрипта php

Сообщение Andrey_B » 12 дек 2018, 11:00

Нужен скриншот сетевых настроек, а также полный исходный код скрипта, который указан в поле "Script".
Речь же об этом скрипте?
kinord писал(а):
12 дек 2018, 08:39
Я вот думаю может ли быть такое, что притормаживает из-за того, что датчик движения некоторое время держит замкнутым порт меги?
Нет.

kinord
Сообщения: 99
Зарегистрирован: 24 фев 2012, 10:08

Re: тормозят выключатели из-за скрипта php

Сообщение kinord » 12 дек 2018, 11:30

Это код, который вызывается с меги при срабатывании датчика, в данном случае этот скрипт запускает exec("cd custom_scripts && php -f penetration.php &") , который ниже

Код: Выделить всё

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.

Кстати, в режиме P&R и R все работает четко, задержки нет

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: тормозят выключатели из-за скрипта php

Сообщение Ruslan » 12 дек 2018, 11:53

kinord писал(а):
12 дек 2018, 11:30
...
На меге порт в режиме P.

Кстати, в режиме P&R и R все работает четко, задержки нет
Может именно в этом все дело, что порт работает в режиме "P". Как правило, датчики движения работают, размыкая сигнальную цепь. Соответственно, если порт для датчика установлен в режиме "P", то будет задержка запуска скрипта, поскольку сначала произойдет размыкание ("R"), и только через некоторый промежуток времени -- замыкание порта ("P").
Это я к тому, что для таких датчиков режим работы порта должен быть "R".

kinord
Сообщения: 99
Зарегистрирован: 24 фев 2012, 10:08

Re: тормозят выключатели из-за скрипта php

Сообщение kinord » 12 дек 2018, 12:02

Нет, датчик именно замыкает порт. Там стоит HC-SR501 с транзисторным ключом на bs170.
И тормозит включение света не того, что заведено на датчик, а другого: т.е. есть две лампочки, одна включается от датчика, другая от выключателя. Если датчик сработал - первая лампочка включается моментально. Жмем выключатель, проходит секунда и после этого только загорается вторая лампочка. Если потом нажимать выключатель пока работает скрипт, то все работает быстро без задержек. Т.е. задержка только при первом нажатии на кнопку выключателя

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

Re: тормозят выключатели из-за скрипта php

Сообщение Andrey_B » 12 дек 2018, 13:06

Проверить ваш код не представляется возможным, так как отсутствует "include.php".
Я предлагаю сделать иначе. Сделайте какой-то упрощенный скрипт (скрипты), который бы у вас точно воспроизводил проблему, и пришлите его.

kinord
Сообщения: 99
Зарегистрирован: 24 фев 2012, 10:08

Re: тормозят выключатели из-за скрипта php

Сообщение kinord » 12 дек 2018, 13:38

что-то кажется мне, что дело не в скриптах, ведь в режиме 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);
}

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

Re: тормозят выключатели из-за скрипта php

Сообщение Andrey_B » 12 дек 2018, 13:59

Мы так долго можем гадать: может прошивка, может не прошивка.
Сделайте код, который у вас воспроизводит описанную проблему, и который я могу запустить у себя.
Тогда я точно смогу сказать, в чем причина.

alex946
Сообщения: 204
Зарегистрирован: 05 дек 2015, 22:48
Контактная информация:

Re: тормозят выключатели из-за скрипта php

Сообщение alex946 » 12 дек 2018, 21:41

exec не форкает процесс, так что имеет полное право тормозить основной скрипт... Есть несколько рецептов решения таких вот фоновых задач с кастомными задержками, рекомендую изучить вот эту простыню: https://stackoverflow.com/questions/459 ... nd-process
особое внимание обратив на готовое решение с proc_open внизу и решение с "&" где-то в середине

kinord
Сообщения: 99
Зарегистрирован: 24 фев 2012, 10:08

Re: тормозят выключатели из-за скрипта php

Сообщение kinord » 13 дек 2018, 06:26

alex946 писал(а):
12 дек 2018, 21:41
exec не форкает процесс, так что имеет полное право тормозить основной скрипт... Есть несколько рецептов решения таких вот фоновых задач с кастомными задержками, рекомендую изучить вот эту простыню: https://stackoverflow.com/questions/459 ... nd-process
особое внимание обратив на готовое решение с proc_open внизу и решение с "&" где-то в середине
Спасибо, почитаю. Может и нефоркает, но я опирался на сатью https://habr.com/post/278755/ , где указано, что с амперсандом в конце именно так и работает как мне надо. И оно в принципе работает, если порт в состоянии P&R. Будет время - сделаю простой скрипт для проверки.

Ответить