Ejemplo n.º 1
0
 public function tearDown()
 {
     if ($this->_modelFoo) {
         $this->_modelFoo->dropTable();
     }
     if ($this->_modelBar) {
         $this->_modelBar->dropTable();
     }
     if ($this->_modelFooToBar) {
         $this->_modelFooToBar->dropTable();
     }
     Kwf_Model_Abstract::clearAllRows();
 }
Ejemplo n.º 2
0
 public function valid()
 {
     $ret = $this->_innerIterator->valid();
     if (!$ret) {
         $s = $this->_innerIterator->getSelect();
         $s->limit($this->_packageSize, $this->_currentOffset);
         $this->_currentOffset += $this->_packageSize;
         //$this->_innerIterator->getModel()->clearRows();
         Kwf_Model_Abstract::clearAllRows();
         $this->_innerIterator->rewind();
         $ret = $this->_innerIterator->valid();
     }
     return $ret;
 }
 public function postUpdate()
 {
     $cmps = Kwf_Component_Data_Root::getInstance()->getComponentsByClass('Kwc_List_ChildPages_Teaser_Component', array('ignoreVisible' => true));
     $num = 0;
     foreach ($cmps as $cmp) {
         $num++;
         if (count($cmps) > 20) {
             echo "updating List ChildPages [{$num}/" . count($cmps) . "]...\n";
         }
         Kwf_Model_Abstract::getInstance('Kwc_List_ChildPages_Teaser_Model')->updatePages($cmp);
         $s = new Kwf_Model_Select();
         $s->whereEquals('component_id', $cmp->dbId);
         foreach (Kwf_Model_Abstract::getInstance('Kwc_List_ChildPages_Teaser_Model')->getRows($s) as $row) {
             $childPage = Kwf_Component_Data_Root::getInstance()->getComponentByDbId($row->target_page_id, array('ignoreVisible' => true, 'limit' => 1));
             $row->visible = isset($childPage->row) && isset($childPage->row->visible) ? $childPage->row->visible : true;
         }
         Kwf_Model_Abstract::clearAllRows();
     }
 }
Ejemplo n.º 4
0
 public function startAction()
 {
     $this->_helper->viewRenderer->setNoRender(true);
     $model = Kwf_Model_Abstract::getInstance('Kwc_Newsletter_Model');
     $procs = array();
     while (true) {
         $select = $model->select()->where(new Kwf_Model_Select_Expr_Or(array(new Kwf_Model_Select_Expr_Equal('status', 'start'), new Kwf_Model_Select_Expr_And(array(new Kwf_Model_Select_Expr_Equal('status', 'startLater'), new Kwf_Model_Select_Expr_LowerEqual('start_date', new Kwf_DateTime(time())))), new Kwf_Model_Select_Expr_Equal('status', 'sending'))));
         $rows = $model->getRows($select);
         $activeCountRows = count($rows);
         foreach ($rows as $newsletterRow) {
             if ($newsletterRow->status != 'sending') {
                 $newsletterRow->resume_date = date('Y-m-d H:i:s');
                 $newsletterRow->status = 'sending';
                 $newsletterRow->save();
             }
             if (!isset($procs[$newsletterRow->id])) {
                 $procs[$newsletterRow->id] = array();
             }
             //remove stopped processes (might stop because of memory limit or simply crash for some reason)
             foreach ($procs[$newsletterRow->id] as $k => $p) {
                 if (!$p->isRunning()) {
                     if ($this->_getParam('debug')) {
                         echo "process " . $p->getPid() . " stopped...\n";
                     }
                     unset($procs[$newsletterRow->id][$k]);
                 }
             }
             $s = new Kwf_Model_Select();
             $s->whereEquals('newsletter_id', $newsletterRow->id);
             $s->whereNull('send_process_pid');
             if (!$newsletterRow->getModel()->getDependentModel('Queue')->countRows($s)) {
                 $newsletterRow->status = 'finished';
                 $newsletterRow->save();
                 if ($this->_getParam('debug')) {
                     echo "Newsletter finished.\n";
                 }
                 //give send processes time to finish
                 sleep(5);
                 //delete "hanging" queue entries
                 $s = new Kwf_Model_Select();
                 $s->whereEquals('newsletter_id', $newsletterRow->id);
                 foreach ($newsletterRow->getModel()->getDependentModel('Queue')->getRows($s) as $queueRow) {
                     $newsletterRow->getModel()->getDependentModel('QueueLog')->createRow(array('newsletter_id' => $queueRow->newsletter_id, 'recipient_model' => $queueRow->recipient_model, 'recipient_id' => $queueRow->recipient_id, 'status' => 'failed', 'send_date' => date('Y-m-d H:i:s')))->save();
                     $msg = "Newsletter finished but queue entry with pid {$queueRow->send_process_pid} still exists: {$queueRow->recipient_id} {$queueRow->searchtext}";
                     $e = new Kwf_Exception($msg);
                     $e->logOrThrow();
                     echo $msg . "\n";
                     $queueRow->delete();
                 }
                 continue;
             }
             if ($this->_getParam('debug')) {
                 echo count($procs[$newsletterRow->id]) . " running processes\n";
             }
             $numOfProcesses = 1;
             if ($newsletterRow->mails_per_minute == 'unlimited') {
                 $numOfProcesses = $this->_getParam('maxProcesses');
                 if (!$numOfProcesses) {
                     $numOfProcesses = 3;
                 }
             }
             while (count($procs[$newsletterRow->id]) < $numOfProcesses) {
                 $cmd = "php bootstrap.php newsletter send --newsletterId={$newsletterRow->id}";
                 if ($this->_getParam('debug')) {
                     $cmd .= " --debug";
                 }
                 if ($this->_getParam('benchmark')) {
                     $cmd .= " --benchmark";
                 }
                 if ($this->_getParam('verbose')) {
                     $cmd .= " --verbose";
                 }
                 $descriptorspec = array(1 => STDOUT, 2 => STDERR);
                 $p = new Kwf_Util_Proc($cmd, $descriptorspec);
                 $procs[$newsletterRow->id][] = $p;
                 if ($this->_getParam('debug')) {
                     echo "\n*** started new process with PID " . $p->getPid() . "\n";
                     echo $cmd . "\n";
                 }
                 sleep(3);
                 //don't start all processes at the same time
             }
             if ($this->_getParam('debug')) {
                 echo "Newletter {$newsletterRow->id}: currently sending with " . round($newsletterRow->getCurrentSpeed()) . " mails/min\n";
             }
         }
         Kwf_Model_Abstract::clearAllRows();
         if ($this->_getParam('debug')) {
             echo "sleep 10 secs.\n";
         }
         sleep(10);
     }
 }
Ejemplo n.º 5
0
 public function tearDown()
 {
     $this->_model->dropTable();
     Kwf_Model_Abstract::clearAllRows();
 }
Ejemplo n.º 6
0
 /**
  * Tries to clear all cached data objects and row objects
  *
  * Usful when processing lot of components to avoid memory issues
  */
 public function freeMemory()
 {
     $this->_freeMemory();
     foreach ($this->_dataCache as $id => $c) {
         if (isset($this->_dataCacheIgnoreVisible[$id])) {
             unset($this->_dataCacheIgnoreVisible[$id]);
         }
         $c->_freeMemory();
     }
     foreach ($this->_dataCacheIgnoreVisible as $id => $c) {
         $c->_freeMemory();
     }
     $this->_dataCache = array();
     $this->_dataCacheIgnoreVisible = array();
     $this->_componentsByClassCache = null;
     $this->_componentsByDbIdCache = null;
     $this->_generatorsForClassesCache = array();
     //Kwf_Component_Generator_Abstract::clearInstances();
     Kwf_Model_Abstract::clearAllRows();
     if (function_exists('gc_collect_cycles')) {
         gc_collect_cycles();
     }
 }
 public function runAction()
 {
     $debug = $this->_getParam('debug');
     if (file_exists('temp/shutdown-maintenance')) {
         unlink('temp/shutdown-maintenance');
     }
     $lastDailyRun = null;
     if (file_exists('temp/maintenance-daily-run')) {
         $lastDailyRun = file_get_contents('temp/maintenance-daily-run');
         if ($debug) {
             echo "last daily run: " . date('Y-m-d H:i:s', $lastDailyRun) . "\n";
         }
     }
     $lastHourlyRun = null;
     if (file_exists('temp/maintenance-hourly-run')) {
         $lastHourlyRun = file_get_contents('temp/maintenance-hourly-run');
         if ($debug) {
             echo "last hourly run: " . date('Y-m-d H:i:s', $lastHourlyRun) . "\n";
         }
     }
     $dailyMaintenanceWindowStart = "01:00";
     //don't set before 00:00
     $dailyMaintenanceWindowEnd = "05:00";
     $nextDailyRun = null;
     $lastMinutelyRun = null;
     while (true) {
         if (!$nextDailyRun) {
             if ($lastDailyRun && $lastDailyRun > strtotime($dailyMaintenanceWindowStart)) {
                 //today already run
                 //maintenance window of tomorrow
                 $nextDailyRun = rand(strtotime("tomorrow {$dailyMaintenanceWindowStart}"), strtotime("tomorrow {$dailyMaintenanceWindowEnd}"));
             } else {
                 //not yet run or today not yet run
                 if (time() < strtotime($dailyMaintenanceWindowEnd)) {
                     //window not yet over for today
                     //maintenance window of today
                     $nextDailyRun = rand(max(time(), strtotime($dailyMaintenanceWindowStart)), strtotime($dailyMaintenanceWindowEnd));
                 } else {
                     //maintenance window of tomorrow
                     $nextDailyRun = rand(strtotime("tomorrow {$dailyMaintenanceWindowStart}"), strtotime("tomorrow {$dailyMaintenanceWindowEnd}"));
                 }
             }
             if ($debug) {
                 echo "Next daily run: " . date('Y-m-d H:i:s', $nextDailyRun) . "\n";
             }
         }
         Kwf_Util_Maintenance_Dispatcher::executeJobs(Kwf_Util_Maintenance_Job_Abstract::FREQUENCY_SECONDS, $debug);
         if (!$lastMinutelyRun || time() - $lastMinutelyRun > 60) {
             $lastMinutelyRun = time();
             Kwf_Util_Maintenance_Dispatcher::executeJobs(Kwf_Util_Maintenance_Job_Abstract::FREQUENCY_MINUTELY, $debug);
             //discard connection to database to reconnect on next job run
             //avoids problems with auto closed connections due to inactivity
             if (function_exists('gc_collect_cycles()')) {
                 Kwf_Model_Abstract::clearAllRows();
                 Kwf_Model_Abstract::clearInstances();
                 gc_collect_cycles();
                 Kwf_Registry::getInstance()->offsetUnset('db');
                 Kwf_Registry::getInstance()->offsetUnset('dao');
             }
         }
         Kwf_Component_Data_Root::getInstance()->freeMemory();
         if (!$lastHourlyRun || time() - $lastHourlyRun > 3600) {
             if ($debug) {
                 echo date('Y-m-d H:i:s') . " execute hourly jobs\n";
             }
             $lastHourlyRun = time();
             file_put_contents('temp/maintenance-hourly-run', $lastHourlyRun);
             Kwf_Util_Maintenance_Dispatcher::executeJobs(Kwf_Util_Maintenance_Job_Abstract::FREQUENCY_HOURLY, $debug);
         }
         Kwf_Component_Data_Root::getInstance()->freeMemory();
         if (time() > $nextDailyRun) {
             if ($debug) {
                 echo date('Y-m-d H:i:s') . " execute daily jobs\n";
             }
             $lastDailyRun = time();
             file_put_contents('temp/maintenance-daily-run', $lastDailyRun);
             $nextDailyRun = null;
             Kwf_Util_Maintenance_Dispatcher::executeJobs(Kwf_Util_Maintenance_Job_Abstract::FREQUENCY_DAILY, $debug);
         }
         sleep(10);
     }
 }
Ejemplo n.º 8
0
 public function testCreateRow()
 {
     return;
     //not yet implemented
     $row = $this->_m->createRow();
     $row->model = '1m';
     //is that the only & best way to select the desired target model?
     $row->save();
     Kwf_Model_Abstract::clearAllRows();
     $models = $this->_m->getUnionModels();
     $this->assertEquals(4, $models['1m']->countRows(array()));
     $s = new Kwf_Model_Select();
     $this->assertEquals(7, $this->_m->countRows($s));
 }