我需要一些帮助,因为我在做CRON过程时还是新手。 我有很多电子邮件,我认为1052封电子邮件。我的计划我想每周送两次,我将在周二和周四开始。所以我可以制作一个间隔,因为我认为它会强调服务器进程。如果我错了,请纠正我。因此,每天70封电子邮件,因此每小时将发送10封电子邮件。这是我的表结构。
+-----------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------------------+------+-----+---------+----------------+
| id | int(4) unsigned zerofill | NO | PRI | NULL | auto_increment |
| client_id | int(10) unsigned | NO | | NULL | |
| email | varchar(100) | NO | | NULL | |
| sent | tinyint(1) unsigned | YES | | 0 | |
| sent_date | date | YES | | NULL | |
| excluded | tinyint(1) unsigned | YES | | 0 | |
+-----------+--------------------------+------+-----+---------+----------------+
默认情况下,如果发送了某个电子邮件,sent
列将更改为1
(默认值为0)。完成发送电子邮件后,所有电子邮件sent column
将再次返回0
。在这个过程中,我没有问题。
我的问题是如何制作一个可以每小时循环的PHP脚本,它将在接下来的几天(周二和周四)运行。 在我的Plesk面板中,我设置了一个每天运行的简单cron。
我正在使用CodeIgniter。在发送电子邮件时,我有一个代码,但它会发送所有客户端。我只想每小时发送10封电子邮件。
public function sendEmail() {
$subj = $this->input->post('email_subject');
$from = 'info@sample.ph';
$cc = $this->input->post('email_cc');
$data['subject'] = $subj;
$content = $this->input->post('email_body');
$this->load->library('email');
$config = array(
'protocol' => 'sendmail',
'smtp_host' => 'mail.sample.ph',
'smtp_port' => 587,
'mailtype' => 'html',
'charset' => 'utf-8'
);
$this->email->initialize($config);
$email_list = $this->getClientEmails(); //all email for now
$valid_email = array();
$invalid_email = array();
if(count($email_list) > 0) {
for($x = 0; $x < count($email_list); $x++) {
if(valid_email($email_list[$x]['email'])) {
$valid_email[] = $email_list[$x]['email'];
}
//get all invalid emails
/*else {
$invalid_email[] = array(
'id' => $email_list[$x]['id'],
'email' => $email_list[$x]['email']
);
}*/
}
}
$email_string = implode(',', $valid_email);
fd($email_list);
$this->email->set_mailtype("html");
$this->email->from($from, 'SAMPLEAdmin');
$this->email->to($email_string); //get all emails from client
$this->email->cc('jolo@sample.ph');
$this->email->subject($subj);
$this->email->message($content);
$send_mail = $this->email->send();
if($send_mail) {
fp('success');
} else {
fp('failed');
}
echo $this->email->print_debugger();
}
这是所有人我希望你明白我真正想要的东西。如果有一些误解,请告诉我。
感谢。
答案 0 :(得分:3)
首先,1000封电子邮件并不是一笔巨大的开销。但是,我喜欢尽量减少尽可能多的服务器压力,这是你正在做的事情。
PHP无法按计划执行自己。 Laravel通过它的任务调度程序做的事情是每分钟都有一个cron任务启动,然后PHP代码决定何时做什么。因此,除非您以类似的方式使用调度程序,否则您需要在plesk所需的日期和时间执行脚本。
实际任务看起来应该是这样的
php -q directoryToYourFile/emailTask.php
-q禁止HTTP标头输出。如果没有-q,它会在运行时通过电子邮件发送给您。实际文件不应该可以从互联网访问,因为您不希望网络爬虫在发生事故时命中您的文件。
**编辑 为了它的价值,我将所有预定的PHP脚本放在httpdocs目录之外,并放入名为tasks的同一级别的文件夹中。这样,除了你在命令行或服务器上之外没有任何东西可以击中文件。