Выгрузка функции скрипта для отправки ответа:методы и передовой опыт?

StackOverflow https://stackoverflow.com/questions/1549453

Вопрос

Первый,

настройка:

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

Этот раздел намеренно многословен, чтобы подчеркнуть свою точку зрения.Пропускайте вперед, если вам это не нравится

Прямо сейчас данные анализируются из действительно обалденного источника с использованием регулярных выражений, а затем разбиваются на массив.Затем он проверяет базу данных на наличие любых данных, уже находящихся в диапазоне дат загруженных данных.Если диапазоны дат данных еще не существуют в базе данных, она вставляет данные и выдает пользователю результат успешного выполнения (также выполняются некоторые проверки безопасности, проверка источника данных и базовая проверка загрузки)...Если данные действительно существуют, скрипт затем получает данные, уже имеющиеся в базе данных, находит различия между двумя наборами, удаляет старые данные, которые не совпадают, добавляет новые данные, а затем отправляет электронное письмо каждому человеку, затронутому этими изменениями (по одному электронному письму на человека со всеми соответствующими изменениями в указанном электронном письме, что является совершенно другим шагом).Адреса электронной почты извлекаются с помощью поиска LDAP, поскольку в нашей базе данных есть их рабочая электронная почта, но в LDAP есть их личная электронная почта, которая гарантирует, что они получат электронное письмо до того, как придут на следующий день и будут застигнуты врасплох.Наконец, отправителю данных сообщают: "Изменения внесены, электронные письма отправлены". на самом деле это все, что их волнует.

Теперь я, возможно, добавляю Google Calendar API, который публикует данные (когда это данные планирования) в Google Calendar пользователя.Я бы сделал это через их рабочий календарь, но я подумал, что мне стоит хорошенько поработать с API Google, прежде чем заниматься настройкой системы WebDAV для Exchange.

</backstory>

Сейчас же!

Практический вопрос

На данном этапе, до интеграции с Google, запуск скрипта занимает не более полутора секунд.Это довольно впечатляюще, по крайней мере, я так думаю (сервер, а не мой код).Но бит Google в тестах ООООЧЕНЬ СЛАБЫЙ.Вероятно, мы можем это исправить, но это поднимает более серьезный вопрос...

Каков наилучший способ отключить часть работы после того, как пользователь получил подтверждение о том, что база данных была обновлена?Это та часть, которая его больше всего волнует и которая наиболее важна.Уведомления по электронной почте и обновления календаря Google предназначены только для тех, кого затронула загрузка, и если с этими уведомлениями возникнут проблемы, он узнает об этом (а затем и я узнаю об этом), независимо от того, какой скрипт сообщит ему об этом первым.

Итак, есть ли способ, например, запустить cronjob, который запускается при последнем выполнении скрипта?Может ли PHP создавать cronjobs с exec() способность?Существует ли какой-то нормализованный способ обработки работы после выполнения, которую необходимо выполнить?

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

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

Лучшие практики / более субъективный вопрос

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

Есть ли какие-то СЕРЬЕЗНЫЕ вещи, которых следует избегать (кроме того, что, очевидно, пользователь вообще не получает никакой обратной связи)?

Спасибо за чтение.Часть кодирования имеет решающее значение, поэтому не чувствуйте себя обязанным описывать вторую часть или забудьте описать часть кодирования!

Это было полезно?

Решение

Есть несколько способов добиться этого.Вы могли бы выполнить (), как сказано выше, но вы потенциально можете столкнуться с ситуацией DoS, если будет слишком много кликов отправки.расширение pcntl, возможно, лучше справляется с управлением подобными процессами.Проверьте этот пост посмотреть обсуждение (состоит из 3 частей).

Вы могли бы использовать Javascript для отправки второго сообщения ajax, которое впоследствии запускает соответствующий рабочий скрипт.Используя ignore_user_abort() и отправляя длину содержимого, браузер может отключиться раньше, но ваш процесс apache продолжит запуск и обработку ваших данных.Плюсом является отсутствие потенциала forkbomb, Недостатком является то, что это откроет больше процессов apache.

Еще один вариант - использовать cron в фоновом режиме, который просматривает таблицу очереди процессов на предмет того, что нужно сделать "позже" - вы помещаете элементы в эту таблицу во внешнем интерфейсе, удаляете их во внутреннем интерфейсе во время обработки (см. Zend_Queue - Запрос).

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

Все зависит от ваших общих возможностей и требований.

Другие советы

Работа cron хороша для этого.Если все, что вы хотите сделать, когда пользователь загружает данные, это сказать "Привет, пользователь, спасибо за данные!", то все будет в порядке.

Если вы предпочитаете более непосредственный подход, то вы можете использовать exec() чтобы запустить фоновый процесс.В среде Linux это выглядело бы примерно так:

exec("php /path/to/your/worker/script.php >/dev/null &");

В & часть гласит: "выведи меня на задний план". The >/dev/null часть перенаправляет выходные данные в черную дыру.Что касается обработки всех ошибок и уведомления соответствующих сторон - все зависит от дизайна вашего рабочего скрипта.

Для более гибкого кроссплатформенного подхода ознакомьтесь с этим Публикация руководства по PHP

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top