запустить скрипт в фоновом режиме с помощью php - PullRequest
0 голосов
/ 20 сентября 2011

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

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

спасибо

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Добавление асинхронных действий, подобных этой, в скрипт PHP не просто, но может добавить огромный выигрыш в производительности, как вы ищете.

Первый подход

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

Второй подход

Для особенно сложной работы, которую мне пришлось выполнить, я фактически уволилсякоманда bash, которая выполнялась в фоновом режиме:

$job = "/bin/myscript $param1 $param2";             
$job = "$job > /dev/null 2> /dev/null";
$cmd = "bash -c \"$job &\"";
exec($cmd)

Обратите внимание, что в этом случае вы действительно не можете контролировать вещи после вызова exec ().

Others

Вот пример, аналогичный моему подходу №2: http://robert.accettura.com/blog/2006/09/14/asynchronous-processing-with-php/

Gearman - еще один инструмент для решения асинхронных задач PHP.Они даже упоминают, что «Zend Framework теперь использует его для выполнения перехватов после фиксации без задержек взаимодействия с коммиттером» http://css.dzone.com/articles/asynchronous-processing-php

1 голос
/ 20 сентября 2011

Переместите фоновое задание в cronjob .

Это может быть что-то вроде этого:

  • У вас есть список пользователей, которых нужно уведомить в таблице
  • создайте скрипт, который будет делать:
    • при каждом запуске скрипта он выбирает несколько строк для обработки
    • когда строка обработана, обновите ее как законченную
  • установить этот скрипт для запуска в xxx минут.

UPDATE

На самом деле есть еще одна хитрость:

  1. у вас есть список пользователей, которых нужно уведомить в таблице users_tobenotified.
  2. у вас есть PHP-скрипт cron, который будет читать эту таблицу и генерировать текстовые файлы в некотором каталоге с именем /data/cron/tobenotified. Этот файл содержит что-то вроде этого:

    [date]\t[time]\t[post-entry]\t[user-tobenotified]\t[someotherinfo]
    
  3. есть другой PHP-скрипт в виде cron, который будет проходить по циклу /data/cron/tobenotified, читать каждый файл и затем обрабатывать его.
  4. тест ... тест ... тест ...
  5. выгода!
0 голосов
/ 20 сентября 2011

Вам необходимо уведомить каждого пользователя индивидуально по электронной почте?

Почему бы просто не отправить 1 электронное письмо со всеми адресами электронной почты ваших пользователей в поле BCC?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...