2016-09-04 5 views
1

У меня есть PHP-скрипт для вывода пользовательских данных из стороннего источника и сбрасывания его в локальную таблицу, которую я хочу выполнить каждые X минут при входе пользователя в систему, но это требуется около 30 секунд для запуска, что я не хочу, чтобы пользователь испытывал. Я полагал, что лучшим способом сделать это будет отметка времени каждой успешной попытки, а затем поместить некоторый код в каждый нижний колонтитул страницы, который проверяет последнее нажатие и выполняет PHP-скрипт в фоновом режиме, если это было больше, чем X минут назад.PHP-страница для выполнения фонового процесса

Я не хочу использовать задание cron для этого, поскольку для выполнения сценария выталкивания необходимы переменные глобального и сеанса, характерные для пользователя.

Я вижу, что popen() позволит мне запустить PHP-скрипт, но я не могу найти никакой информации о том, будет ли он запускаться как посетитель в рамках их сеанса (и, следовательно, с доступом к пользовательские глобальные или сеансовые переменные) или как отдельный сеанс в целом.

  1. Будет ли popen() решить мою проблему?
  2. Я собираюсь сделать это правильно или есть лучший способ выполнить скрипт с интервалом во время входа пользователя в систему?

Любая помощь или совет очень ценится, как всегда!

Приветствия

Энди

+0

Отдельный процесс - это отдельный сеанс. Скорее всего, легче загрузить сессию в скрипт (полностью зависит от кода и управления сеансами) или просто передать JSON (или сериализованный массив) с информацией в качестве аргумента для процесса. –

+0

Какова причина того, что вам нужно выполнить этот код каждые X минут, когда пользователь вошел в систему? Что делает код? – Sherif

ответ

0

Я хотел бы использовать Javascript и AJAX запросы для вызова скрипта из внешнего интерфейса и обработки результата. Затем вы можете установить интервал в JavaScript и отправить AJAX-Request каждый интервал.

+1

Если вы используете стандартный обработчик сеанса (который использует файлы), вы не можете создавать новые запросы, так как он должен дождаться завершения вызова ajax. Ajax-вызов блокирует файл сеанса, и поэтому новые запросы не могут получить к нему доступ, что заставляет их зависать. – MarcHoH

+0

Это относится только тогда, когда он хочет сделать одновременно запросы. –

2

Возможно, идея поставить данные сеанса также в таблицу. Таким образом, вы можете легко получить к нему доступ из фонового процесса. Вам нужно передать только session_id() или user id, чтобы процесс знал, какой пользователь он обрабатывает.

0

AJAX является то, что вам нужно: http://api.jquery.com/jquery.ajax/

Использование метода «успех», чтобы сделать что-то после этих 30 секунд.

2
  1. Нет, потому что PHP по-прежнему нужно ждать на процессе начатого popen(), прежде чем он может выйти
  2. Вероятно, нет, потому что решение не соответствует архитектурным ограничениям системы

Вашим рассуждение о том, что вы не используете работу cron, на самом деле не звучит. Возможно, вы отказались от изучения этого конкретного пути слишком быстро и втянули себя в угол, пытаясь поместить квадратный штифт в круглое отверстие.

Реальная проблема, с которой вы сталкиваетесь, заключается в том, как осуществлять межпроцессное взаимодействие между веб-запросом и PHP, работающим на вашем crontab. Это может быть решено несколькими способами и более легко, затем пытается работать с архитектурными ограничениями PHP.

Например, вы можете хранить идентификаторы сеанса в своей базе данных или в каком-либо другом хранилище и получать доступ к файлам сеансов из скрипта PHP, работающего в вашем crontab, независимо от веб-запроса.

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

Задача cron может запускаться каждые X минут, просматривать базу данных или хранилище персистентности для любых записей, которые имеют активную временную метку в заданном диапазоне, вытягивать эти идентификаторы сеанса и делать то, что необходимо.

Теперь вопрос о том, как вы на самом деле получите это, чтобы эффективно масштабировать, если время обработки занимает более 30 секунд, можно решить самостоятельно. See this answer for more details on how to deal with distributed job managers/queues from PHP.