2016-08-30 2 views
1

私はCRONプロセスをやっている中でまだ新しいので、私はこれにいくつかの助けが必要です。 私は1052の電子メールと思う多くの電子メールを持っています。私の計画私は週に2回送ろうと思っています。私は火曜日と木曜日に設定します。私はそれがサーバープロセスを強調すると思うので、私は間隔を作ることができるように。私が間違っていれば私を修正してください。 1日あたり70件のメールがあるので、1時間に10件のメールが送信されます。ここに私のテーブル構造があります。デフォルトでCRONを使用して1週間に1回ループして実行できるPHPスクリプトを作成する方法は?

+-----------+--------------------------+------+-----+---------+----------------+ 
| 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列は(デフォルトは0)1に変更されます。メールの送信が完了したら、sent columnのメールはすべて0に再度送信されます。そのプロセスで私は疑問を持っていません。

私の問題は、1時間ごとにループするPHPスクリプトを作成し、翌日(火曜日と木曜日)に実行する方法です。 私のPleskパネルでは、毎日実行する簡単なcronを設定しました。

私はこれにCodeIgniterを使用しています。電子メールを送信する際にはコードがありますが、すべてのクライアントが送信されます。私はちょうど毎時10の電子メールを送りたいと思う。

public function sendEmail() { 

    $subj = $this->input->post('email_subject'); 
    $from = '[email protected]'; 
    $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('[email protected]'); 
    $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(); 

} 

私が本当に欲しいものを理解していただければ幸いです。何か誤解がある場合は、私に知らせてください。

ありがとうございました。

答えて

3

まず、1000通のメールは大きなオーバーヘッドではありません。しかし、私はできるだけ多くのサーバーストレスを最小限に抑えるというルールを踏襲しています。

PHPはスケジュールどおりに実行できません。タスクスケジューラでLaravelがこれを得るために行うことは、cronタスクを毎分キックオフしてから、PHPコードがいつ何をするかを決定することです。同様の方法でスケジューラを使用している場合を除き、pleskで必要な日時にスクリプトを実行する必要があります。

実際のタスクは、-qはHTTPヘッダの出力を抑制し、この

php -q directoryToYourFile/emailTask.php 

ようになるはずです。 -qを指定しないと、実行するたびにメールが送信されます。 Webクローラーがあなたのファイルを偶然に襲ってしまわないようにするため、実際のファイルはインターネットからアクセスできないようにしてください。

**編集 私の予定されているすべてのPHPスクリプトをhttpdocsディレクトリの外に置いて、タスクと呼ばれる同じレベルのフォルダに置きます。そうすれば、コマンドラインやサーバー上であなたを除いてファイルにヒットすることはできません。

関連する問題