如何使用CRON创建一个可以在一周内循环和运行一次的PHP脚本?

时间:2016-08-30 01:38:08

标签: php codeigniter email cron

我需要一些帮助,因为我在做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();

}

这是所有人我希望你明白我真正想要的东西。如果有一些误解,请告诉我。

感谢。

1 个答案:

答案 0 :(得分:3)

首先,1000封电子邮件并不是一笔巨大的开销。但是,我喜欢尽量减少尽可能多的服务器压力,这是你正在做的事情。

PHP无法按计划执行自己。 Laravel通过它的任务调度程序做的事情是每分钟都有一个cron任务启动,然后PHP代码决定何时做什么。因此,除非您以类似的方式使用调度程序,否则您需要在plesk所需的日期和时间执行脚本。

实际任务看起来应该是这样的

php -q directoryToYourFile/emailTask.php

-q禁止HTTP标头输出。如果没有-q,它会在运行时通过电子邮件发送给您。实际文件不应该可以从互联网访问,因为您不希望网络爬虫在发生事故时命中您的文件。

**编辑 为了它的价值,我将所有预定的PHP脚本放在httpdocs目录之外,并放入名为tasks的同一级别的文件夹中。这样,除了你在命令行或服务器上之外没有任何东西可以击中文件。