public function perform() { Interspire_TimerStack::start(); if (!$this->_validateExport()) { $this->_logDebug('export validation failed'); $this->_removeExport(); Interspire_TimerStack::stop(); return; } if ($this->_getExportData('pause')) { // not ideal to simply requeue the task, but this is for dev purposes only $this->_logDebug('job is paused, requeueing task'); $this->_repeatExport(); Interspire_TimerStack::stop(); return; } $this->_logDebug('export ' . $this->_type . ' starting from row ' . $this->_skip . ' with batch size ' . self::BATCH_SIZE); $method = '_perform' . $this->_type . 'Export'; $counter = $this->$method(); $duration = Interspire_TimerStack::stop(); if ($counter) { // track average time taken per item over batches sent // may be used in future to dynamically adjust the batch size to fit into pre-determined request times // can also be used to compare speeds between modules $samples = $this->_keystore->increment('email:module_export:' . $this->_module->GetId() . ':avg_item_samples'); $peritem = $duration / $counter; if ($samples > 1) { $previous = (float)$this->_keystore->get('email:module_export:' . $this->_module->GetId() . ':avg_item'); $peritem = $previous + (($peritem - $previous) / $samples); } $this->_keystore->set('email:module_export:' . $this->_module->GetId() . ':avg_item', $peritem); } if (!$counter) { // only repeat if the type-specific export actually exported something $this->_endExport(); return; } $this->_keystore->increment($this->_prefix . 'skip', $counter); $this->_repeatExport(); }
/** * Generate merge data for a list subscription (or batch of list subscriptions) for this module based on provided field mapping. * * @param Interspire_EmailIntegration_Subscription $subscription single subscription of array of subscriptions * @param string $listId provider_list_id * @param array<provider_field_id=subscription_field_id> $fieldMap * @param bool $includeEmail include built-in email address field in merge data */ public function getMergeData($subscription, $listId, $fieldMap, $includeEmail = false) { Interspire_TimerStack::start(); if (is_array($subscription)) { $single = false; $subscriptions = $subscription; } else { $single = true; $subscriptions = array($subscription); } /** @var ISC_LOG */ $log = $GLOBALS['ISC_CLASS_LOG']; $list = $this->getList($listId); // get list fields so we know how to translate data $providerFields = $this->getListFields($list['provider_list_id']); foreach ($providerFields as $index => $providerField) { // change the fields array so it has a map of provider_field_id => field $providerFields[$providerField['provider_field_id']] = $providerField; } // note: this takes about 3 - 4 secs per 100 records, but I can't spot an optimisation for it right now $batch = array(); foreach ($subscriptions as /** @var Interspire_EmailIntegration_Subscription */$subscription) { $item = array(); $subscriptionFields = $subscription->getFlatSubscriptionFields(); $subscriptionData = $subscription->getSubscriptionData(); foreach ($fieldMap as $providerFieldId => $subscriptionFieldId) { if (!isset($subscriptionData[$subscriptionFieldId])) { // this used to log an error but with the customer class not all data is always available so it's changed to a debug $log->LogSystemDebug(array('emailintegration', $this->GetName()), 'Invalid field mapping specified. Local field "' . $subscriptionFieldId . '" specified in mapping, but not found in subscription data.', var_export($subscriptionData, true)); continue; } if (!isset($providerFields[$providerFieldId])) { $log->LogSystemError(array('emailintegration', $this->GetName()), 'Invalid field mapping specified. Provider field "' . $providerFieldId . '" specified in mapping, but not found in provider field list.', var_export($providerFields, true)); continue; } if (!isset($subscriptionFields[$subscriptionFieldId])) { $log->LogSystemError(array('emailintegration', $this->GetName()), 'Invalid field mapping specified. Local field "' . $subscriptionFieldId . '" specified in mapping, but not found in subscription-class field list.', var_export($subscriptionFields, true)); continue; } $item[$providerFieldId] = $this->translateMergeField( $subscriptionFields[$subscriptionFieldId], $providerFields[$providerFieldId], $subscriptionData[$subscriptionFieldId], $subscriptionData ); } if ($includeEmail) { $item[$this->getEmailProviderFieldId()] = $subscription->getSubscriptionEmail(); } $batch[] = $item; } $log->LogSystemDebug(array('emailintegration', $this->GetName()), 'batch data generated for ' . count($batch) . ' subscriptions in ' . number_format(Interspire_TimerStack::stop(), 3) . ' secs'); if ($single) { return $batch[0]; } return $batch; }