【问题标题】:How to make a PHP script that can loop and run once in a week using CRON?如何使用 CRON 制作一个每周可以循环运行一次的 PHP 脚本?
【发布时间】:2017-01-06 03:40:20
【问题描述】:

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

}

这就是我希望你们明白我真正想要的一切。如果有什么误解,请告诉我。

谢谢。

【问题讨论】:

    标签: php codeigniter email cron


    【解决方案1】:

    首先,1000 封电子邮件并不是很大的开销。但是,我喜欢遵循您正在做的尽可能减少服务器压力的规则。

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

    实际的任务应该是这样的

    php -q directoryToYourFile/emailTask.php
    

    -q 禁止 HTTP 标头输出。如果没有 -q,它会在运行时向您发送电子邮件。不应从 Internet 访问实际文件,因为您不希望网络爬虫意外访问您的文件。

    **编辑 值得一提的是,我将所有计划的 php 脚本放在 httpdocs 目录之外,并放入名为 tasks 的同一级别的文件夹中。这样,除了您在命令行或服务器上之外,没有任何东西可以访问该文件。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2014-09-25
      • 2016-04-14
      • 1970-01-01
      • 2011-01-04
      • 2013-04-02
      • 2019-10-09
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多