Я пишу приложение PHP, в котором SMS отправляется человеку и ждет «x» минут, пока этот человек войдет в систему. Если человек не войдет в систему в течение «X» минут, база данных будет обновлена соответствующим образом, и следующий ожидающий будет проинформирован.
Я пытаюсь найти способ вызвать функцию через «X» минут, чтобы база данных обновилась и следующий пользователь был проинформирован. Я хочу сделать это, не опрашивая базу данных каждую секунду, чтобы проверить, вошел ли первый пользователь в систему или нет. Я пытаюсь найти способ выполнить проверку один раз по прошествии "X" минут, а затем проинформировать следующего пользователя. Что-то вроде функции Javascript settimeout.
Я хочу сделать это на стороне сервера, и решение должно работать на платформах Windows или Linux.
Пожалуйста посоветуй
Спасибо!
Я наткнулся на пакет PEAR «Диспетчер событий», но нет возможности вызывать события по таймауту. PECL, «Событие», похоже, не поддерживает на моем сервере хостинг-провайдера.
Привет, @KIKOSoftware. Поскольку время ожидания (X минут) устанавливается пользователем, я не хочу угадывать время и опрашивать базу данных. Потому что тогда это будет не в реальном времени. Я пытаюсь минимизировать накладные расходы на опрос каждые несколько минут.
Используйте библиотеку очередей, например, php-resque, который использует redis для обслуживания очереди. Таким образом, тайм-аут просто приведет к тому, что следующая вещь в очереди начнет обрабатываться.
Привет, @apokryfos, спасибо. Это кажется интересным, я обязательно проверю это и сообщу вам здесь.
Привет @apokryfos. Извините, у меня недостаточно очков репутации, чтобы проголосовать за ваш комментарий. Как установить тайм-аут в этой библиотеке?
Я не знаю, я никогда не использовал его, но каждая очередь запускается работником очереди, который по сути просто запускает процесс PHP. Если у вас есть что-то вроде set_timeout(X) в вашем коде задания в очереди, это должно работать как средство, гарантирующее, что задание не займет больше X секунд. Тогда ваша задача - добавить что-нибудь в очередь. Рабочий удалит из очереди первую задачу и будет работать над ней, а когда это будет сделано, удалит из очереди следующую.
Полный отказ от ответственности. Я прокомментировал вместо ответа, потому что это сложная проблема, и вам нужно будет выполнить некоторые настройки, чтобы заставить ее работать. Очередь - это (imo) самый простой способ сделать это, но я не могу предложить полное решение, которое вам придется изучить подробнее.
Привет @apokryfos. Спасибо. Я ценю, что вы нашли время, чтобы прокомментировать и предложить. Я прочитаю об этом подробнее.






Я не смог найти чистого PHP-решения для вышеупомянутого.
Мое обходное решение заключалось в том, чтобы делегировать эту задачу сервелту (java), который может запускать метод после тайм-аута. Мой сервлет после получения запроса запустит тайм-аут, а затем отправит ответ моему PHP-приложению, когда тайм-аут истечет.
Пока что это было лучшее решение, которое я мог найти.
Как насчет «опроса» каждые несколько минут? Например, с заданием cron.