Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Cron作业在幕后发送电子邮件_Php - Fatal编程技术网

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();
            }
        }