我有一个奇怪的错误。我有一个脚本,每天为~12K用户发送电子邮件。它工作了大约3个月,然后几天前开始垃圾邮件。它向所有用户发送了大约15份电子邮件,当然,他们开始抱怨。该脚本每天被cron作业激活一次,并且根据服务器的支持,它只被触发一次而没有任何问题。当我尝试将脚本解压缩到只有一个电子邮件地址时,它工作正常,但当我尝试再次发送所有电子邮件时,我遇到了获得多个副本的相同问题。我将其解雇到同一个电子邮件地址,以避免再次向用户发送垃圾邮件。我放了一些日志语句来查看被触发的计数和电子邮件,看到一些奇怪的东西:一旦它到达用户列表的末尾,我看到列表开头的电子邮件被解雇了。类似的东西:
2014-04-13 04:33:02 Email: 12340 yyy@gmail.com
2014-04-13 04:33:03 Email: 12341 yyy@hotmail.com
2014-04-13 04:33:03 Email: Daily email function got called <- looks like it gets trough new iterations
2014-04-13 04:33:03 Email: 12342 yyy@gmail.com
2014-04-13 04:33:03 Email: 12343 yyy@o2.pl
2014-04-13 04:33:03 Email: 12344 yyy@yahoo.com
2014-04-13 04:33:03 Email: 12345 yyy@aol.com
2014-04-13 04:33:03 Email: 12346 yyy@outlook.com
2014-04-13 04:33:03 Email: 12347 yyy@hotmail.com
2014-04-13 04:33:03 Email: 1 yyy@gmail.com
2014-04-13 04:33:03 Email: 12348 yyy@comcast.net
2014-04-13 04:33:03 Email: 2 yyy@yahoo.com
2014-04-13 04:33:03 Email: 12349 yyy@yahoo.es
2014-04-13 04:33:03 Email: 3 yyy@hotmail.com
2014-04-13 04:33:03 Email: 12350 yyy@hotmail.com
2014-04-13 04:33:03 Email: 4 yyy@yahoo.com
2014-04-13 04:33:03 Email: 12351 yyy@gmail.com
2014-04-13 04:33:03 Email: 5 yyy@gmail.com.com
2014-04-13 04:33:03 Email: 12352 yyy@hotmail.com
看起来这个脚本第二次被调用,但可能会叫它?
功能:
function daily_email() {
CakeLog::write('email', 'Daily email function got called');
$count = 0;
ini_set("memory_limit", "2048M");
set_time_limit("0");
$from = array('yyy@yyyy.com' => 'yyyyyyyyy');
$subject = 'bla';
$template = 'daily';
$layout = 'daily_layout';
$users_data = $this->User->find('all', array('conditions' => array('User.unsubscribed ' => '0')));
foreach ($users_data as $user) {
$count++;
$user = $user['User'];
$to = $user['email_address'];
$s5 = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 31); //change security string every day
$offer_link = 'http://bla.bla.com' . $s5;
$unsubscribe_link = "http://" . $_SERVER['HTTP_HOST'] . "/dailies/user/unsubscribe/" . $user['id'];
$this->Emailer->send_email($from, $to, $subject, $template, $layout, $offer_link, $unsubscribe_link, $s5);
$this->User->id = $user['id'];
$user['is_used'] = 0;
$user['security_string'] = $s5;
$this->User->save($user);
}
CakeLog::write('email', 'Sent ' . $count . ' emails');
$this->autoRender = false;
}
电子邮件组件:
App::uses('Component', 'Controller');
App::uses('CakeEmail', 'Network/Email');
class EmailerComponent extends Component {
function send_email($from, $to, $subject, $template, $layout, $offer_link, $unsubscribe_link, $s5=null) {
$email = new CakeEmail();
$email->template($template, $layout);
$email->emailFormat('html');
$email->to($to);
$email->from($from);
$email->subject($subject);
$email ->viewVars(array('offer_link' => $offer_link, 'unsubscribe_link' => $unsubscribe_link, 's5' => $s5));
$email ->send();
}
}
Cron工作:
0 4 * * * /usr/bin/wget -O /dev/null http://www.myNiceSite.com/dailies/user/daily_email
此外,不确定它是否相关,但ps aux在脚本运行后显示两个进程。
先谢谢你们提供任何帮助
答案 0 :(得分:0)
看起来我找到了问题的根源。 Wget调用脚本并等待响应,但脚本完成需要很长时间。所以wget再次调用,它可能在无限循环中进入。现在,修复是在脚本运行时在数据库中设置标志,它会阻止脚本第二次运行。