在后台执行带有参数的类方法 PHP


Execute class method PHP with parameters on the background

我有一个向许多收件人发送邮件的类方法,此方法接收 2 个参数(一个是整数,另一个是字符串(,但是,当从主进程调用此方法时,超时过期并且发送没有结束。然后,我需要这个函数(发送(在后台运行,我需要动态传递参数,到目前为止我已经尝试使用 exec() 命令。

我确实在某处读到我可以传递类和方法名称,只需在命令中放置一个空格。因此,我是triyng的命令是exec(/usr/bin/php /home/cesar/www/mails.php notices send 1 'Text' > /dev/null);但是,这个突击队不起作用,因为我没有收到邮件。

在此命令中:

  • 邮件.php = 文件脚本 php
  • 通知 = 类名
  • 发送 = 方法名称
  • 1 = 参数1
  • "文本" = 参数2

然后,我有很多问题:

  1. 在后台运行此命令的正确方法是什么?
  2. 如何动态传递参数?我只是将命令字符串与我的变量连接起来吗?

顺便说一下,这是与"无脂肪框架"一起工作的。

提前谢谢你,

来自墨西哥的雷加德,

除了Omar的回答之外,我在这里发布了另外两个特定于框架的解决方案:

解决方案 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 作业的网络托管来启用此解决方案。

exec 需要一个字符串参数,你还必须转义你用 escapeshellarg 发送的文本,所以整个命令应该看起来像这样工作:

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

现在在您的邮件中.php您可以像这样阅读文本:

$text_to_send = $argv[5];

除此之外,您还有其他选择在后台发送电子邮件,例如,您可以将文本存储在数据库表中,然后创建一个 cron 作业,该作业每工作一次,例如 1 分钟,检查该表中是否有任何文本要发送,然后在从数据库发送文本后删除文本。

另一种选择是使用库来创建后台作业来发送电子邮件,例如 php-resqueGearman