php - 如何在后台运行我的 php 脚本以发送电子邮件通知
问题描述
提交表单后,我可以向所有用户发送电子邮件,但这需要一些时间。我想要实现的是跳过该任务(发送电子邮件)并在提交表单后在后台运行它。因此,除了等待完成任务(发送电子邮件)之外,用户还可以做其他事情。
我试图查看https://laravel.com/docs/4.2/queues但我是 Laravel 的初学者,我不太了解文档。顺便说一句,我使用的是 laravel 4.2 的旧 laravel 版本。
APK文件控制器.php
$users = User::All();
foreach($users as $user) {
$data = array(
'apk_name' => Input::get('name'),
'version' => $apk->version,
'download_link' => Input::get('remarks'),
'subject' => 'v' . $apk->version . ' is now available.',
'message' => 'A new version of APK has been released!',
);
$this->userMailer->sendToApp($user, compact('data'));
}
}
用户邮件程序.php
<?php namespace Sample\Mailers;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Lang;
use User;
class UserMailer extends Mailer
{
public function sendToApp(User $user, $data)
{
$subject = $data['data']['subject'];
$view = 'emails.clients.apkInfo';
return $this->sendTo($user, $subject, $view, $data);
}
}
邮件程序.php
<?php namespace Sample\Mailers;
use Illuminate\Mail\Mailer as Mail;
abstract class Mailer {
private $mail;
function __construct(Mail $mail) {
$this->mail = $mail;
}
public function sendTo($user, $subject, $view, $data = [] )
{
$this->mail->queue($view, $data, function ($message) use ($user, $subject) {
$message->to($user->email)->subject($subject);
});
}
}
解决方案
您可以创建一个工匠命令,就像这里描述的那样:
构建生成类的命令
要创建一个新命令,你可以使用命令:make Artisan 命令,它会生成一个命令存根来帮助你开始: 生成一个新的命令类
php artisan command:make FooCommand
默认情况下,生成的命令会存放在 app/commands 目录下;但是,您可以指定自定义路径或命名空间:
php artisan command:make FooCommand --path=app/classes --namespace=Classes
创建命令时, --command 选项可用于分配终端命令名称:
php artisan command:make AssignUsers --command=users:assign
然后,您创建一个 crontab 计划来运行您的命令,如下所述:
添加 Cron 作业永久链接
在文本编辑器中为您的用户打开一个 crontab(在大多数发行版中为 vi):
crontab -e
笔记:
要更改使用的文本编辑器,请将环境变量添加到您的 ~/.bashrc 文件中,将 vim 替换为 nano,或您喜欢的任何其他基于终端的编辑器。
export EDITOR=vim
添加 Cron 作业,保存并退出。crontab 将保存在 /var/spool/cron/crontabs 作为特定于创建它的用户的 crontab。要稍后从中删除 Cron 作业,请从用户的 crontab 文件中删除该行。
推荐阅读
- tcp - 如何强制终止 Ejabberd 会话
- php - 如果结果集中的值与当前登录的用户不匹配,则有条件地使用备用值
- amazon-web-services - 如何从 EKS Monitoring 中账户 A 中的 node-exporter pod 中提取账户 B 中的 Prometheus pod 的日志?
- listview - FDQuery.Refresh 在单独的线程中同时 LiveBindings AutoActive := true
- typescript - 从另一个接口中的键的字符串数组创建具有固定长度键的 Record 类型
- java - spring security 允许 ms-word:nft|u| 链接
- azure - 生成预留报告的 RBAC 角色 - 最小权限原则
- javascript - 将数据从 firebase-service-worker 传递到 Flutter Web 应用
- python - 函数内部的 int(intput()) 不起作用?
- ubuntu - Vscode如何用文件/目录/应用文件隐藏顶部栏?