cronで自分専用のアリバイ君とかリマインダーを作ってみる

昨日ポストしたレンサバのcron数制限をPHPで無限に増やす方法では、1つのPHPプログラムから他のプログラムを呼び出すことでcron制限数を超えるスケジューリングを行いました。

これと同じ仕組みを応用し、指定の時間にメール送信するプログラムにしてみたいと思います。

仕事してると見せかけるアリバイ君とか、用事を思い出させるリマインダーのような使い方ができます。(・∀・)

応用といってもPHPのメール送信は鬼のように簡単なので、プログラムはさらに短くなります。改造を繰り返せば、何か面白いWEBサービスのアイデアになるかも☆彡

全体のプログラム

下のソースが全体です。かなり短いソースですが、これだけで指定時刻にメールを送信できるリマインダーとして機能します。

reminder.php としてソースを UTF-8 で保存後に、レンサバにアップ&できれば1分間隔でcron設定してください。

レンサバによってはcronが2分間隔や5分間隔しか設定できない場合もあります。その場合は最短間隔で登録するしかないですが、メール送信時間も2分間隔でしか設定できません。

動作すると reminder.ini と reminder_log.txt が作成されます。もし作成されない場合はセーフモード等でファイル作成権限がない等が考えられます。

reminder.iniは動作に必要ですが、reminder_log.txtはログなので必要ない場合は、 @file_put_contents( LOG , $log , FILE_APPEND ); をコメントアウトしてください。

<?php
mb_language('Ja');
mb_internal_encoding('UTF-8');
define ( 'INI' , 'reminder.ini' );
define ( 'LOG' , 'reminder_log.txt' );
define ( 'RUN' , 'running' );
define ( 'LOGDATE' , 'Y/m/d' );
define ( 'LOGTIME' , 'H:i:s' );

$now = time();
$prevtime = @file_get_contents( INI );
if ( $prevtime == RUN || $prevtime + 55 > $now ) exit;
if ( empty($prevtime) ) $prevtime = $now; // 初回用初期値セット
@file_put_contents( INI , RUN ); // 実行中フラグセット


// スケジュール --
$log .= date(LOGTIME);
if ( date('Y/m/d H:i') == '2012/04/03 09:50' ){
    $log .= ' '.date('Y/m/d H:i');
    mb_send_mail_log( 'to@example.com' , '題名' , '本文' , 'from@example.com' ); // メール送信
}

$log .= date(LOGTIME);
if ( date('Y/m/d H:i') == '2012/10/03 10:50' ){
    $log .= ' '.date('Y/m/d H:i');
    mb_send_mail_log( 'to@example.com' , '誕生日' , 'おめでとう!' , 'from@example.com' ); // メール送信
}
// ---------------


$log .= "\n";
@file_put_contents( LOG , $log , FILE_APPEND );
@file_put_contents( INI , $now );

function mb_send_mail_log( $to , $subject , $body , $from ){
    global $log;
    $log .= " mail {$to} {$subject}";
    $from = "From: {$from}";
    if ( mb_send_mail( $to , $subject , $body , $from ) ){
        $log .= ' 成功';
    } else {
        $log .= ' 失敗';
    }
}
?>

スケジュール部分

$log .= date(LOGTIME);
if ( date('Y/m/d H:i') == '2012/04/03 09:50' ){
    $log .= ' '.date('Y/m/d H:i');
    mb_send_mail_log( 'to@example.com' , '題名' , '本文' , 'from@example.com' ); // メール送信
}

ここでスケジュールを登録しています。このプログラムの核ですが、特に説明は必要ないかと思います。

iniファイルは何をしているの?

プログラムの動作に必要なiniファイルには、前回このプログラムが動いた日時が記録されています。

cronの予定通り1分に1度だけ実行される保証があれば良いのですが、もし1分間に2度プログラムが走った場合、メール送信も2回行われてしまいます。そのため動いた日時を記録しておいて、そこから55秒間はプログラムが走らないようになっています。

 

広告