Выполнить метод класса PHP с параметрами в фоновом режиме

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

Я где-то читал, что могу передать имя класса и метода, только поставив пробел в команде. Поэтому команда, которую я пробую, это exec(/usr/bin/php /home/cesar/www/mails.php notices send 1 'Text' > /dev/null); однако этот коммандос не работает, потому что я не получаю почту.

В этой команде:

  • mail.php = файл скрипта php
  • уведомления = имя класса
  • отправить = имя метода
  • 1 = параметр1
  • 'Текст' = параметр2

Тогда у меня много вопросов:

  1. Как правильно запустить эту команду в фоновом режиме?
  2. Как я могу передавать параметры динамически? Мне просто объединить командную строку с моими переменными?

Кстати, это работа с "Fat-Free Framework".

Заранее спасибо,

Регадс из Мексики,


person Cezaryto    schedule 07.02.2016    source источник


Ответы (2)


В дополнение к ответу Омара я публикую здесь еще два решения, характерных для этой платформы:

Решение 1.

Используйте метод фреймворка abort(), чтобы отключить HTTP-клиент и продолжить отправку почты в фоновом режиме:

$f3->route('GET|POST /myroute',function($f3){
    echo 'Well done Callaghan!'; // message for the client
    $f3->abort(); // stop response here => the client can request something else
    // now we can run extra tasks in the background
    ini_set('max_execution_time',3600);// it may take some time
    $mail->send();
    $mail->send();
    $mail->send();
    ...

});

Решение 2.

Используйте плагин фреймворка Cron для планирования фоновых задач:

$cron=Cron::instance();
$cron->set('MassMailing','Mass\Mailing->go','@hourly');
// Mass\Mailing->go will be executed every hour

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

person xfra35    schedule 08.02.2016

exec ожидает строковый параметр, также вам нужно экранировать текст, который вы отправляете с помощью escapeshellarg , поэтому вся команда должна выглядеть следующим образом:

 $text_to_send = "Hello World , "
 exec("/usr/bin/php /home/cesar/www/mails.php notices send 1 " . $text_to_send . " > /dev/null");

теперь в вашем mail.php вы можете получить такой текст:

$text_to_send = $argv[5];

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

другой альтернативой является использование библиотеки для создания фонового задания для отправки электронных писем, таких как php-resque или gearman.

person Omar    schedule 07.02.2016