朝出掛けにcronの設定したらうっかり毎分実行のタスクとかを作ってしまったので自戒のためメモ。
まちがわないために
mtdowlingがcron parserを作ってくれているのでそれを使ってチェックすればいける。
サンプル
composer.json
{
"require": {
"mtdowling/cron-expression": "1.0.*",
"phpunit/phpunit": "*"
}
}
<?php
require_once 'vendor/autoload.php';
date_default_timezone_set("Asia/Tokyo");
class CronTest extends PHPUnit_Framework_TestCase {
// ヒャッハー
public static $cron = "* * * * * /usr/bin/php /path/to/batch.php\n";
public function testCronExpression()
{
$content = $this->getCronContent();
$base = strtotime(date("Y-m-d H:i:00")) + 60;
foreach (explode("\n", $content) as $line) {
$cron = Cron\CronExpression::factory(substr($line, 0, $this->seekOffset($line)));
// 今の時間から3回分の実行予定時刻を得る
//実際はもっとナイスに書かないといけないけどこれでテストきる
$dates = $cron->getMultipleRunDates(3);
foreach ($dates as $date) {
$next = $date->format("Y-m-d H:i:s");
$this->assertEquals(date("Y-m-d H:i:s", $base), $next);
$base += 60;
}
}
}
public function seekOffset($line)
{
$line = trim($line);
$length = strlen($line);
$count = 0;
if ($line[0] == '@') {
// てきとーに
return strpos($line, " ");
} else {
for ($i = 0; $i < $length; $i++) {
if ($line[$i] == " ") {
$count++;
}
if ($count == 5) {
return $i+1;
}
}
}
throw new InvalidArgumentException("passed valued doesn't contain cron expression");
}
public function getCronContent()
{
return trim(self::$cron);
}
}
というか
出掛けにcron設定するとかどうよ、ワタシ(ヽ'ω`)