['period' => '*/10 * * * *'], 'itemsCronUnpublicate' => ['period' => '0 0,12 * * *'], 'itemsCronViews' => ['period' => '0 0 * * *'], 'itemsCronDeleteInactiveUsers' => ['period' => '30 0 * * *'], 'itemsCronVirtualCategories' => ['period' => '* * * * *'], 'sphinxRotate' => ['period' => '4 3 * * *'], ]; } public function itemsCronStatus() { if (! $this->isCron()) { return; } # Актуализация статуса объявлений $this->model->itemsCronStatus(); } public function itemsCronUnpublicate() { if (! $this->isCron()) { return; } # 1. Уведомление о скором завершении публикации объявлений $soon = $this->config('listings.item.unpublicated.soon', [], TYPE_ARRAY); $days = []; foreach ($soon as $k => $v) { if (! $v) { continue; } $days[] = $k; } if (! empty($days)) { $this->itemsUnpublicateSoonNotify($days); } # 2. Помечаем снятые с публикации объявления более N дней как удаленные $days = $this->config('listings.delete.unpublicated.timeout', 0, TYPE_UINT); if ($days > 0) { $this->model->itemsCronUnpublicatedTimeout($days); } # 3. Полное удаление объявлений $days = $this->config('listings.delete.timeout', 0, TYPE_UINT); if ($days > 0) { $this->model->itemsCronDelete($days); } } public function itemsCronViews() { if (! $this->isCron()) { return; } $this->model->itemsCronViews(); $this->model->itemsCountersCalculate(); $this->model->itemsCountersCalculateVirtual(); } /** * Помечаем снятые с публикации объявления как удаленные для неактивных аккаунтов пользователей. * Раз в сутки */ public function itemsCronDeleteInactiveUsers() { if (! $this->isCron()) { return; } $days = $this->config('listings.delete.inactive.users.timeout', 0, TYPE_UINT); if ($days > 0) { $this->model->itemsCronDeleteInactiveUsers($days); } } public function itemsCronVirtualCategories() { if (! $this->isCron()) { return; } $this->model->itemsCountersCalculateVirtual(); } /** * Перемещение объявлений в подкатегории. Вызывается из cron-manager */ public function itemsCatsRebuild() { if (! $this->isCron()) { return; } $this->model->itemsCatsRebuild(); if (! $this->errors->no()) { $this->log($this->errors->get(true, false)); } } /** * Обновление ссылок объявлений. Вызывается из cron-manager * @return void */ public function itemsLinksRebuild() { if (! $this->isCron()) { return; } $this->model->itemsLinksRebuild(); if (! $this->errors->no()) { $this->log($this->errors->get(true, false)); } } /** * Пересчет hash-сумм изображений объявлений * @param array $params * @return void */ public function itemsImagesHashUpdate(array $params) { if (! $this->isCron()) { return; } $force = !empty($params['force']); $this->itemImages()->updateFilesHash($force); } /** * Обновление ссылок посадочных страниц для категорий. Вызывается из cron-manager * @param array $params * @return void */ public function landingpagesUriRebuild($params = []) { if (! $this->isCron()) { return; } if (empty($params['old'])) { return; } $old = $params['old']; $new = bff::urlPrefix('listings', 'list', 'search'); if (empty($old) || empty($new) || $old == $new) { return; } $old = '/' . $old . '/'; $new = '/' . $new . '/'; $l = mb_strlen($old); $chunk = 200; $filter = [ 'joined_module' => 'listings-cats', 'joined' => ['>', 0], ]; # обновим посадочные страницы $last = 0; do { if ($last) { $filter['id'] = ['>', $last]; } $data = Seo::model()->landingpagesListing($filter, false, $this->db->prepareLimit(0, $chunk), 'id'); if (empty($data)) { break; } foreach ($data as $v) { $last = $v['id']; if (mb_substr($v['original_uri'], 0, $l) == $old) { Seo::model()->landingpageSave($v['id'], [ 'original_uri' => $new . mb_substr($v['original_uri'], $l), ]); } } } while (! empty($data)); unset($filter['id']); # обновим редиректы $last = 0; do { if ($last) { $filter['id'] = ['>', $last]; } $data = Seo::model()->redirectsListing($filter, false, $this->db->prepareLimit(0, $chunk), 'id'); if (empty($data)) { break; } foreach ($data as $v) { $last = $v['id']; if (mb_substr($v['from_uri'], 0, $l) == $old) { Seo::model()->redirectSave($v['id'], [ 'from_uri' => $new . mb_substr($v['from_uri'], $l), ]); } } } while (! empty($data)); if (! $this->errors->no()) { $this->log($this->errors->get(true, false)); } $this->itemsLinksRebuild(); } /** * Обновление main индексов сфинкс */ public function sphinxRotate() { $sphinx = $this->itemsSearchSphinx(); if (! $sphinx::masterEnabled()) { return; } $sphinx->rotateMainIndexes(); } public function onceRecalculatePublicationPeriod($params = []) { if (! $this->isCron()) { return; } $this->itemPublicationPeriod()->cronOnceRecalculate($params); } }