制限付きのクロンを無限寿限無にする方法改正版
Photo by Anete Lusina on Pexels.com

制限付きのクロンを無限寿限無にする方法改正版

2025年11月15日
文字数[3014文字] この記事は4分46秒で読めます.

おはようございます.以前作ったコードを改修して、いまの自分が書いたらどうなるのだろうかと思って書いたコードをQiitaGithubにアップしました.書いてみて思ったのは、やはりコードは書けば書くほど進化していくのだなという事.

そして思うのはAIにはこのコードは今の所書けないような気がしています.典型的なコードでもなく洗練すぎたコードでもないので、書けそうにない.見る人がみるとこれは人が書いたコードだと分かるかなと思います.

そういうのがコレからは人が書いたコードというお墨付きを貰えるのではないかと思います.なので、ちょっと完璧なコードではないコードを書いて行こうと思います.仕事ではAIを使用することが今後多くなると思うけど、まだ次の職に付いていないので毎日コードを精進のために書いていきます.

過去記事はこちら

で、今回書いたソースコードはこちらになります.

<?php
class CronExpansion
{
    private $filepath = 'crontab.json';
    private $cronTabs = null;

    public function __construct()
    {
        $fileData = file_get_contents($this->filepath);
        $cronTabData = json_decode($fileData);
        $this->cronTabs =  !json_last_error() ? (object)$cronTabData : (object)[];
        return $this;
    }

    public function run(): object
    {
        $datetime = new DateTime();
        $dateData = explode(',', $datetime->format('m,d,H,i,w'));
        foreach ($this->cronTabs as $cronTab) {
            $i = 0;
            $flg = true;
            $command = null;
            $cronTabDatas = get_object_vars($cronTab);
            if (count($cronTabDatas) === 6) {
                foreach ($cronTabDatas as $key => $val) {
                    if ($flg) {
                        switch ($key) {
                            case 'command':
                                $command =  $val;
                                break;
                            case 'w':
                                if (!(int)$val[(int)$dateData[$i]]) {
                                    $flg = false;
                                    continue;
                                }
                                break;
                            default:
                                if (preg_match('/^\*\/[0-9]{1,2}$/u', $val)) {
                                    if (((int)$dateData[$i] % ((int)str_replace('*/', '', $val))) > 0) {
                                        $flg = false;
                                        continue;
                                    }
                                } elseif (preg_match('/^\*$/u', $val)) {
                                } elseif ((int)$dateData[$i] !== (int)$val) {
                                    $flg = false;
                                    continue;
                                }
                                break;
                        }
                    }
                    $i++;
                }
                if ($flg) {
                    //echo $command;
                    exec($command . " > /dev/null &");
                }
            }
        }
        return $this;
    }
}
(new CronExpansion)->run();

明日へ続く