Задать вопрос
@xsash

Как реализовать на PHP независимое выполнение двух и более функций?

Добрый.

Колхожу для себя небольшую автоматизацию на нескольких простых контроллерах. Контроллеры могут отправлять и принимать данные (в моем случае от php скрипта).

Простые задачи - "нажали на кнопку => включили/выключили свет" - реализуются тривиально и просто
//код утрирован и упрощен
$click = $_GET["click"];

if ( $click == "1" )
{
	switchOver();
}

function switchOver()
{
	file_get_contents("http://192.168.0.201/?lamp=01&cmd=off");
}

Примерно аналогично прописано считывание RFID ключа - получили ID ключа => "что-то сделали"; опрос по cron со стороны сервера некоторых датчиков и так далее.

А как правильнее реализовать, например "мигание". Есть реле, есть лампочка, включаем на 2 секунды, выключаем на 2 секунды...
В простом и грубом исполнении - это бесконечный цикл с задержкой
while (true)
{
	file_get_contents("http://192.168.0.201/?out=1&cmd=on");
	sleep(2000);

	file_get_contents("http://192.168.0.201/?out=1&cmd=off");
	sleep(2000);
}

Допустим должно быть "мигание", после срабатывания датчика. Да, можно поставить break на некое условие, но пока будет выполнятся "sleep" - все будет простаивать.

Имеет ли смысл подобные задачи запускать в отдельных потоках, а потом при необходимости их убивать по некому id? Или есть классическое решение подобных задач?

Пока рассматриваю exec("command &") как одно из потенциальных решений
  • Вопрос задан
  • 220 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 5
Morfeey
@Morfeey
Асинхронные запросы (ajax), что бы более быстрее это все делать, думаю можно сокетами воспользоваться.
Ответ написан
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
На ум сразу приходят два варианта:
1. запускать "мигалку" отдельным процессом через system()
2. реализовать очередь задач и в бесконечном цикле выбирать задачу из этой очереди и выполнять её. Например добавляем задачу:
2017-12-04 9:00:00 Включить лампочку
в функции switchOver() пишем код, который добавляет задачу: 2017-12-04 9:00:02 Выключить лампочку
в функции выключения - код добавляющий: 2017-12-04 9:00:04 Включить лампочку
И так далее.
Вначале бесконечного цикла происходит выборка задач на текущее время и отрабатываются.
Ответ написан
Комментировать
@BorisKorobkov Куратор тега PHP
Web developer
Каждый новый http-запрос и так автоматически создаст новый PHP-поток. Так что sleep() в одном никак не повлияется на второй (хотя и будет создавать небольшую нагрузку, держать соединение, занимать память и пр.).
Если запросов не так много - можно так и оставить. Но лучше как минимум переделать на очередь.

Если запросов много - лучше переписать на асинхронном Node.JS
Ответ написан
@synapse_people
установи rabbitmq, затем туда закидывай задачи на исполнения, а где-то в других процессах забирай
Или вариант fork / pthreads
Ответ написан
Комментировать
sanchezzzhak
@sanchezzzhak
Ля ля ля...
через Command Bus или process symphony которые запускают скрипты через proc_open

Важно помнить при запуске в асинхронном режиме каждую команду: если родитель скрипта завершится раньше запуленных шин то все шины умрут в месте с родителем,
такова особенность функций proc* в windows/unix
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы