PHP and Cron Usually, it makes sense to run the cron job in crontab and trigger a PHP script command. But I have a single IOCUtil object and a lot of related codes there. So on top of a cron parser, I provide a CronService.php class as follow: "mtdowling/cron-expression": "^1.1" The method run will be called several times. <?php namespace BillingConsumerPHP; require __DIR__.'/../../vendor/autoload.php'; use \Cron\CronExpression; use \DateTime; class CronService { private $ioc = null; private $crons = null; private $jobs = null; public function __construct($ioc) { $this->ioc = $ioc; } public function addJob($jobName, $jobPattern){ $cron = CronExpression::factory($jobPattern); $this->crons[$jobName] = $cron; $this->jobs[$jobName] = null; } public function run(){ $now = new DateTime("now"); foreach ($this->jobs as $key => $value){ if(null !== $value && !empty($value)){ //have cache, compare $next = $value; if($now >= $next){ //execute $this->call($key); //calcuate next one to cache $cron = $this->crons[$key]; $next = $cron->getNextRunDate(); $this->jobs[$key] = $next; } }else{ //calculate the next date $cron = $this->crons[$key]; $next = $cron->getNextRunDate(); if($now >= $next){ //excute $this->call($key); //calcuate next one to cache $next = $cron->getNextRunDate(); $this->jobs[$key] = $next; }else{ $this->jobs[$key] = $next; } } } } private function call($jobName){ $logger = $this->ioc->getService("logger"); switch ($jobName) { case 'backupData': $this->backupData(); break; default: $logger->warning("jobName {$jobName} is not defined in system!"); } } public function backupData(){ $logger = $this->ioc->getService("logger"); $logger->debug("try to backup data to mysql"); } } ?> Every time it will check the next run time with current time to decide if we should run some tasks. There is short comings, if one task takes too long time, system will miss some tasks in schedule. Unite tests <?php use \BillingConsumerPHP\IOCUtil; /** * * RUNNING_ENV=test phpunit --bootstrap vendor/autoload.php tests/BillingConsumerPHP/CronServiceTest * * @author carl * */ class CronServiceTest extends PHPUnit_Framework_TestCase { private $cronService; protected function setUp() { $ioc = new IOCUtil(); $this->cronService = $ioc->getService("cronService"); } public function testDummy() { $this->assertTrue(true); } public function testCronService(){ $this->cronService->addJob('backupData', '* * * * * *'); $i = 0; while($i<10){ $this->cronService->run(); $i++; } } } ?> Reference: https://github.com/mtdowling/cron-expression
php cron类,PHP and Cron
最新推荐文章于 2024-08-13 08:27:34 发布