php таймер в цикле
Мне нужно реализовать таймер ожидания ВНУТРИ цикла обработки веб-сокетов PHP React (возможно, многопоточность?)
У меня есть веб-сокет-приложение, на котором я создаю игру, основанную на Ratchet, которая использует цикл событий React. В начале этого сценария я уже выяснил, как реализовать периодический тимер, чтобы каждую секунду посылать импульсы в игру, а затем выполнять тики и боевые раунды. Это прекрасно работает.
Однако недавно я понял, что мне также нужно будет добавить возможность «отставать» от клиентов или приостанавливать выполнение в функции. Например, если игрок ошеломлен, или я хочу, чтобы NPC подождал 1,5 секунды, прежде чем ответить на триггер для более «реалистичного» разговорного ощущения.
Встроена ли эта функциональность в библиотеку реагирования, или я собираюсь добиться чего-то другим? После некоторого исследования, похоже, что pthreads — это то, что я могу искать, см. Этот вопрос / ответ: Как можно использовать многопоточность в приложениях PHP
Чтобы быть более понятным с тем, что я пытаюсь достичь, возьмите этот код в качестве примера:
Очевидно, это не работает, так как функция sleep (1) остановит весь процесс сервера.
Любое понимание будет с благодарностью. Спасибо!
Обновление: Мой серверный скрипт:
Решение
Хорошо, так что я собираюсь предположить, что, поскольку это все еще остается без ответа, не существует «простого» решения, запрограммированного в цикле событий реакции, хотя я бы хотел ошибиться в этом. До тех пор я решил опубликовать свое решение.
Замечания: Я понятия не имею, каковы последствия этого. Я понятия не имею, насколько это масштабируемо. Он не тестировался в реальной среде с несколькими процессами и игроками.
Однако я думаю, что это достойное решение. Моя конкретная игра ориентирована на количество игроков от 20 до 30, поэтому я думаю, что единственная проблема, с которой я могу столкнуться, — это если куча действий в очереди стреляет в одну и ту же секунду.
Первое, что я сделал (некоторое время назад), добавил периодический таймер при запуске сервера:
У меня также есть некоторые глобальные переменные в моем «мировом» классе:
Заметка биения а также process_queue.
Моя функция doBeat () выглядит так:
Теперь в моем глобальном объекте «Мир» у меня есть пара других функций:
Теперь, чтобы добавить процесс в очередь, вот моя новая мобильная команда «onSay ()»:
Таким образом, если мобильный телефон слышит «привет», «привет» или «привет», функция «toRoom» (которая отправляет строку каждому символу в той же комнате) будет добавлена в очередь процесса и сработает через 2 секунды после оригинальная функция была выполнена.
Я надеюсь, что все это имеет смысл, и если кто-нибудь знает, как лучше реализовать такие вещи в php и в цикле событий, пожалуйста, ответьте / прокомментируйте. Я не отмечаю это как «правильное», как я уже сказал выше, я понятия не имею, насколько эффективно это будет в производстве.
Другие решения
Amp (другая реализация цикла событий) имеет Amp\Pause который делает именно это. Может быть, вы можете использовать это как вдохновение, если вы хотите выполнить обещание, как упомянуто.
Таймер в php
У меня вопрос, можно ли в php через определенное время вызывать нужную функцию?
Добавлено через 46 минут
UP! UP! UP!
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Таймер php
Здравствуйте. Как сделать перенаправление на другую страницу при истечении 10 сек. Знаю что.
Таймер на PHP
Мне нужен таймер например 10 мин(выводить в браузере обратный отчет), по истечении времени нужно.
Таймер php
Привет всем! Проблема: у меня ест таймер. Надо поставить так чтобы у таймера был интервал 3 дня. Я.
а если 50 или 100 функции и каждые надо запускать через час?
Добавлено через 34 минуты
а вот так не вариант?
зачем извращаться и ввязывать туда cron, это все легко и просто делается связкой js + php. Т.е. каждые 5 минут js будет посылать запрос к скрипту.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Таймер php
Здравствуйте, как сделать таймер на php чтобы он выполнял действие каждый час и при подключении.
Таймер в php
Всем привет! Уважаемые знатоки, помогите решить задачу. Дано: цены, которые должны изменяться.
Таймер на PHP
Здравствуйте, возникла проблема. Мне нужен чистый таймер на PHP в коде, который по прохождению.
Примеры
Пример #1 Простые таймеры
// Запускаем событийный цикл, пока работает хотя бы один наблюдатель или пока не вызван Ev::stop()
Ev :: run ();
Результатом выполнения данного примера будет что-то подобное:
Пример #2 Периодический таймер. Срабатывает раз в 10.5 секунд
Пример #3 Периодический таймер. Использование callback-функции для перезадания интервала
// Срабатывает раз в 10.5 секунд
Пример #4 Периодический таймер. Срабатывает каждые 10.5 секунд, начиная с текущего момента
Пример #5 Ждём, пока STDIN не станет читаемым
Ev :: run ( Ev :: RUN_ONCE );
?>
Пример #6 Используем асинхронный ввод/вывод для доступа к сокету
/* Используем асинхронный ввод/вывод для доступа к сокету */
// Модуль `sockets’ продолжит логировать предупреждения
// для EINPROGRESS, EAGAIN/EWOULDBLOCK etc.
error_reporting ( E_ERROR );
// Получаем IP-адрес целевого хоста
$address = gethostbyname ( ‘google.co.uk’ );
Результатом выполнения данного примера будет что-то подобное:
Пример #7 Встраиваем один цикл в другой
Пример #8 Встраивание цикла, созданного с помощью kqueue в цикл по умолчанию
/*
* Проверяем, что бэкенд kqueue доступен, но не рекомендован, и создаём его для
* работы с сокетами (которые обычно работают с любой реализацией kqueue).
* Сохраняем событийный цикл kqueue/socket-only в loop_socket. (Можно опционально
* использовать флаг EVFLAG_NOENV)
*
* Пример взят из
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop = EvLoop :: defaultLoop ();
$socket_loop = NULL ;
$embed = NULL ;
if ( Ev :: supportedBackends () &
Пример #9 Перехватываем сигнал SIGTERM
Пример #10 Отслеживаем изменение /var/log/messages
Пример #11 Отслеживаем изменение /var/log/messages. Избегаем пропуска обновлений с помощью задержки в одну секунду
Пример #12 Отслеживаем изменения статуса процесса
Таймер обратного отсчета на PHP
Здравствуйте, почитал различные темы на форуме, но ответа для своего случая так и не нашел. Отсюда вопросик:
Есть дата наступления события, и хочу выводить оставшееся до нее время в формате d:h:m:s средствами php и чтоб не обновлять всякий раз страницу, но таймер таки шел Пытаюсь это сделать таким вот макаром:
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Живой таймер обратного отсчета с PHP кодом при завершении
Здравствуйте, уважаемые эксперты! Перегуглил весь интернет и так и не нашёл ничего подходящего.
Таймер обратного отсчета
Стоит такая задача есть несколько ссылок у которых необходимо задать разное время их показа к.
Таймер обратного отсчета
Здравствуйте, прошу простить если не туда написал ( не тот топ). Моя проблема заключается в.
Действительно, чтобы не обновлять каждый раз страницу, Вам понадобиться AJAX запрос на Ваш скрипт по таймеру:
На нужной страничке, вставьте код:
Ну хорошо. А как, по Вашему ещё можно вывести результат таймера на экран, без применения JS?
Ведь, на сколько я понял ситуацию: Автор желает произвести расчёт, путём PHP кода, но видеть результат на своей странице в динамичном виде, т.е. не обновляя страницу цифры должны каждую секунду показывать время до события.
Ничто другое, как AJAX тут не сгодится.
Добавлено через 2 минуты
А Вам, tarasalk, остаётся только подумать, как в файле TIMER.PHP произвести расчёт, чтобы в echo выходил результат оставшегося времени до события.
Жжесть. Конечно все виснет. По сути вы вешаете программу в бесконечный цикл, благо после 30 сек (по умолчанию) ваш скрипт киллится и все, что за эти 30 сек успело вывестись отправляется браузеру, который от такого кол-ва строк тоже захлебывается и виснет
Добавлено через 4 минуты
С ajax’ом тоже не все просто будет. Как хотите обновлять время? Раз в секунду? Каждую секунду слать запрос? Та ну. тем более, что запрос тоже длится какое-то время и иногда таймер будет скакать.
Получить конечную дату нужно только один раз, при помощи ajax или сразу при загрузке страницы. Далее должен стартовать таймер на js, и на основе этой конечной даты и текущих часов компьютера пользователя вести обратный отсчет.
Фоновое выполнение скрипта на PHP без crontab
Озадачили меня тут написать демона на PHP. Т.е. скрипт, который будет заданное количество раз в заданное количество часов в случайное время (всегда случайное) выполнять определенные действия, и все это без использования cron’a.
До этого никогда не заморачивался, а тут после постановки задачи, начал было думать что так нельзя, что php скрипт надо вызывать браузером…ну задача то поставлена, надо выполнять.
Первая мысль — отключить ограничение времени выполнения скрипта. Запрещено хостером.
Вторая мысль — яваскриптом повторять аякс-запрос периодически (да хоть раз в секунду). — нельзя (требование заказчика).
Выяснилось, собственно, что и браузер открыт не должен быть, и крон нельзя использовать, и работать скрипт должен независимо от пользователя, бесконечно долго. Естественно, он должен минимум грузить систему.
1. Пачка сигарет, ночь, гугл, доки, книги, мануалы….
goto 1…
На выходе получаю:
Задача_1:
Реализовать генератор времен выполнения скрипта, исходя из заданных количества раз и количества часов. Хранить где-то эти времена.
Задача_2:
Работать после закрытия браузера
Задача_3:
Не вылетать после окончания ограничения времени выполнения скрипта
Задача_4:
Выполнять в нужное время какие-то действия.
Итак…
Пишем в конфиге исходные данные:
Далее пишем функцию, которая поможет нам сгенерировать времена запуска.
В ней мы генерируем случайное число от 0 до количества секунд в исходном интервале.
Далее сгенерируем и запишем в сессию массив времен запуска. Предварительно отсортируем массив по возрастанию, чтобы сначала шло раннее время (машину времени я еще не успел создать).
Теперь надо заставить скрипт работать, не обращая внимания на максимальное время выполнения, установленное сервером.
Принцип таков:
1) Определяем время начала работы скрипта;
2) Определяем установленное ограничение на время выполнения.
3) Запускаем цикл, внутри которого считаем текущее время и вычисляем общее время работы скрипта, сверяем текущее время со значениями в массиве времен запуска, и если совпадение есть, выполняем заданные действия (у меня они в файле exec.php). Для запуска файлов используем сокеты.
4) Повторяем цикл пока время работы скрипта не приблизится к максимально разрешенному. Я поставил — пока до максимального времени не останется 5 секунд.
Итак… считаем начальные данные по времени:
Собственно, цикл. Комментарии в коде.
Ну и, если разрешенное время подходит к концу, то завершаем цикл и благополучно запускаем этот же скрипт другие процессом (в 5 секунд точно уложимся)
Собственно, готово.
Далее у меня много заморочек было в выполнении тех самых действий — там надо было робота написать для поиска ссылок по заданным ссылкам.
Когда дописал все, озадачился полезным применением…Использовать его можно как службу. Он может следить за чем-то в сети и уведомлять Вас, например, по почте. И не надо никаких cron’ов.
Скрипт можно еще оптимизировать — доработкой не занимался.
Кстати, вот от чего я не смог оторваться — браузер все же придется открыть, чтобы изначально запустить скрипт.