Php 使用Cron作业在幕后发送电子邮件
我有这个方法来通知我的追随者,在添加新事件后会调用它。它可以工作,但如果有多封电子邮件,则会使整个过程非常缓慢,因为弹出窗口会等待所有电子邮件都已发送,然后再向用户显示事件已添加,旋转的轮子将永远转动。在用户收到事件已添加的消息后,我想不出任何方法可以在幕后进行Php 使用Cron作业在幕后发送电子邮件,php,Php,我有这个方法来通知我的追随者,在添加新事件后会调用它。它可以工作,但如果有多封电子邮件,则会使整个过程非常缓慢,因为弹出窗口会等待所有电子邮件都已发送,然后再向用户显示事件已添加,旋转的轮子将永远转动。在用户收到事件已添加的消息后,我想不出任何方法可以在幕后进行 public function notifiedFollowers($creator_id, $type, $event_id){ $query = $this->_db->prepare("SELECT * FROM
public function notifiedFollowers($creator_id, $type, $event_id){
$query = $this->_db->prepare("SELECT * FROM followers WHERE user_id = ?");
$query->bindParam(1, $creator_id, PDO::PARAM_INT);
$query->execute();
while($row = $query->fetch(PDO::FETCH_OBJ)) {
$creator = new User($creator_id);
$creatorName = $creator->data()->name;
$user = new User($row->followers_id);
$mail = new PHPMailer();
$template = New MailFactory();
$mail->IsSMTP();
$mail->Host = "myHost";
$mail->SMTPAuth = true;
$mail->Username = "myUser";
$mail->Password = "myPassword";
$mail->IsHTML(true);
$mail->From = 'from email';
$mail->FromName = 'from name';
$mail->AddAddress($user->data()->username);
$mail->Subject = 'add subject here';
$mail->Body = $template->notifiedFollowersEmail($creatorName, $user->data()->name, $type, $event_id);
if(!$mail->send()) {
echo $mail->ErrorInfo;
die();
}
}
}
*更新******
我使用cron作业解决了这个问题。请检查我的答案。您正在寻找
此代码将在代码的后台异步工作,用户无需等待任何步骤完成
看看你要找的这个
此代码将在代码的后台异步工作,用户无需等待任何步骤完成
看看这个我终于找到了一个完美的解决方案: 首先,我创建了一个数据库,存储必须完成的工作
CREATE TABLE IF NOT EXISTS `cron_jobs_new_event` (
`cron_job_id` int(32) NOT NULL AUTO_INCREMENT,
`event_id` int(32) NOT NULL,
`user_id` int(32) NOT NULL,
`notify` int(32) NOT NULL,
`executed` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`cron_job_id`),
KEY `event_id` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
--
-- Constraints for table `cron_jobs_new_event`
--
ALTER TABLE `cron_jobs_new_event`
ADD CONSTRAINT `cron_jobs_new_fk` FOREIGN KEY (`event_id`) REFERENCES `event` (`event_id`) ON DELETE CASCADE ON UPDATE CASCADE;
我使用hostgator,因此我将cron作业设置为每15分钟运行一次:
php只是从我的类通知中调用一个方法
我希望这对其他人有所帮助我终于找到了一个完美的解决方案: 首先,我创建了一个数据库,存储必须完成的工作
CREATE TABLE IF NOT EXISTS `cron_jobs_new_event` (
`cron_job_id` int(32) NOT NULL AUTO_INCREMENT,
`event_id` int(32) NOT NULL,
`user_id` int(32) NOT NULL,
`notify` int(32) NOT NULL,
`executed` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`cron_job_id`),
KEY `event_id` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
--
-- Constraints for table `cron_jobs_new_event`
--
ALTER TABLE `cron_jobs_new_event`
ADD CONSTRAINT `cron_jobs_new_fk` FOREIGN KEY (`event_id`) REFERENCES `event` (`event_id`) ON DELETE CASCADE ON UPDATE CASCADE;
我使用hostgator,因此我将cron作业设置为每15分钟运行一次:
php只是从我的类通知中调用一个方法
我希望这对其他人有帮助谢谢。我必须使用函数run吗?或者我可以只在类中复制我的函数吗?在run中复制函数并调用$aEmail->start in loop对不起,我可以在start$creator\u id、$type、$event\u id中传递变量吗?否创建数组/对象并通过类发送并在构造函数中设置。检查更新。在您的情况下,发送对象$mail并调用$mail->send in run谢谢。我必须使用函数run吗?或者我可以只在类中复制我的函数吗?在run中复制函数并调用$aEmail->start in loop对不起,我可以在start$creator\u id、$type、$event\u id中传递变量吗?否创建数组/对象并通过类发送并在构造函数中设置。检查更新。在您的情况下,发送对象$mail并调用$mail->send in run
<?php require 'core/init.php';
$notification = new Notification();
$notification->notifiedFollowers();
public function notifiedFollowers(){
$query = $this->_db->prepare("SELECT user_id FROM cron_jobs_new_event WHERE executed = '0' AND notify = '1'");
$query->execute();
while($row = $query->fetch(PDO::FETCH_OBJ)) {
$userCreator = $row->user_id;
$q = $this->_db->prepare("SELECT * FROM followers WHERE user_id = ?");
$q->bindParam(1, $userCreator, PDO::PARAM_INT);
$q->execute();
while($followers = $q->fetch(PDO::FETCH_OBJ)) {
$type='try';
$creator = new User($followers->user_id);
$creatorName = $creator->data()->name;
$userFollower = new User($followers->followers_id);
$mail = new PHPMailer();
$template = New MailFactory();
$mail->IsSMTP();
$mail->Host = "my host";
$mail->SMTPAuth = true;
$mail->Username = "my username";
$mail->Password = "myPassword";
$mail->IsHTML(true);
$mail->From = 'ev';
$mail->FromName = 'Events Team';
$mail->AddAddress($userFollower->data()->username);
$mail->Subject = 'Somebody add a new event!';
$mail->Body = $template->notifiedFollowersEmail($creatorName, $userFollower->data()->name, $type, $followers->event_id);
if(!$mail->send()) {
echo $mail->ErrorInfo;
die();
}
}
//here I update the database so next time the cron runs, It won't send the same message
$update = $this->_db->prepare("UPDATE cron_jobs_new_event SET executed = '1' WHERE cron_job_id = ?");
$update->bindParam(1, $row->cron_job_id, PDO::PARAM_INT);
$update->execute();
}
}