我有一个向许多收件人发送邮件的类方法,此方法接收 2 个参数(一个是整数,另一个是字符串(,但是,当从主进程调用此方法时,超时过期并且发送没有结束。然后,我需要这个函数(发送(在后台运行,我需要动态传递参数,到目前为止我已经尝试使用 exec()
命令。
我确实在某处读到我可以传递类和方法名称,只需在命令中放置一个空格。因此,我是triyng的命令是exec(/usr/bin/php /home/cesar/www/mails.php notices send 1 'Text' > /dev/null)
;但是,这个突击队不起作用,因为我没有收到邮件。
在此命令中:
- 邮件.php = 文件脚本 php
- 通知 = 类名
- 发送 = 方法名称
- 1 = 参数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-resque 或 Gearman。