Выполнить PHP-скрипт в фоновом режиме ... Какие решения лучше всего подходят для моего случая? - PullRequest
3 голосов
/ 12 ноября 2010

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

Я нашел функцию PHP с именем ignore_user_abort(), которая необходима для поддержания работоспособности страницы.если время истекло.

Теперь у меня есть три решения для «запуска скрипта»:

  1. Я мог бы использовать iframe

  2. Я мог бы использовать вызов Ajax, который я предварительно настроил на тайм-аут очень рано.Например: используя jQuery Framework : $.ajaxSetup({ timeout: 1000 });

  3. Я мог бы использовать задание cron, но я бы хотел избежать этого решения, поскольку они являются «виртуальными» инестабильно на этом сервере.

Есть ли другие решения?Мне не очень нравится решение iframe, но я уже использую его со скриптом загрузки Ajax.

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

Пользователям компании было приказано входить в CMS только через Firefox.Спасибо

Ответы [ 3 ]

10 голосов
/ 12 ноября 2010

Вы можете запустить PHP-скрипт в фоновом режиме, используя Exec().

php docs . Пример того, как вы можете это сделать:

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
}
0 голосов
/ 12 ноября 2010

Только потому, что вы закрываете браузер, скрипт, запущенный php, не должен останавливаться. Итак, как я понимаю, у вас есть несколько способов сделать это:

  1. Отправьте сообщение POST на сервер, сообщая, что вы хотите выполнить какое-либо действие, и сценарий выполняется до его завершения. Перезагрузка страницы предупредит браузер о том, что вам потребуется повторно отправить данные и т. Д. Вы можете выполнить POST асинхронно с javascript, чтобы предотвратить это и иметь возможность делать другие вещи во время выполнения скрипта. Здесь следует обратить внимание на то, что время выполнения скрипта может быть ограничено.

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

  3. Cron (вы, кажется, уже исследовали эту опцию)

0 голосов
/ 12 ноября 2010

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

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


Редактировать Учитывая вашу причину не использовать задания cron (т. Е. У вас нет доступа к серверу в оболочке), я бы не использовал этот подход.

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

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

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