/** * Основной метод, регистрирующий класс для закрытия * * @param Destructable $inst - Экземпляр класса, которй будет гарантированно закрыт в свою очередь * @param int $order - порядок закрытия */ public static function registerDestructable(Destructable $inst, $order) { /* * Класс получаем через get_called_class(), так как PsShotdownSdk может быть переопределён проектным */ $class = get_called_class(); /* * Проверяем, что нам передан валидный order */ $order = PsUtil::assertClassHasConstVithValue($class, null, PsCheck::int($order)); /* * Регистрируем shutdown */ if (is_null(self::$DESTRUCTS)) { PsUtil::assertClassHasDifferentConstValues($class); self::$DESTRUCTS = array(); register_shutdown_function(array(__CLASS__, '_doShotdown')); } /* * Проверим, что нет попытки повторной регистрации с тем-же order */ if (array_key_exists($order, self::$DESTRUCTS)) { raise_error("Попытка повторно зарегистрировать Destructable с порядком [{$order}] для класса " . get_class($inst)); } /* * Регистрируем класс на закрытие */ self::$DESTRUCTS[$order] = $inst; }
private function __construct(DirItem $di, $min, $max, $step) { $this->di = $di; $this->min = PsCheck::int($min); $this->max = PsCheck::int($max); $this->step = PsCheck::int($step); //Проверки check_condition($this->max > $this->min, "Некорректные границы [{$this->min}, {$this->max}] для {$this}"); check_condition($this->step > 0, "Некорректный шаг [{$this->step}] для {$this}"); }
/** * Метод регистрации страницы * * WebPages::register('xxx.php', 'Консоль администратора', PAGE_ADMIN, self::getIdent(), AuthManager::AUTH_TYPE_NO_MATTER, PAGE_ADMIN); * * @param string $path - путь к скрипту, например 'xxx.php' * @param string $name - название страницы, например 'Консоль администратора' * @param int $code - код страницы PAGE_ADMIN * @param int $builderIdent - идентификатор построителя страниц, например 'PB_admin::getIdent()' * @param int $authType - тип авторизации, необходимый для доступа к странице, например 'AuthManager::AUTH_TYPE_NO_MATTER' * @param int $pageCodeNoAccess - страница, на которую нужно перейти при отсутствии доступа, например 'BASE_PAGE_INDEX' * @param bool $allovedInProduction - признак, доступна ли страница в ProductionMode */ protected final function register($path, $name, $code, $builderIdent = null, $authType = AuthManager::AUTH_TYPE_NO_MATTER, $pageCodeNoAccess = null, $allovedInProduction = true) { if (!$allovedInProduction && PsDefines::isProduction()) { return; //---- } $path = PsCheck::notEmptyString($path); $name = PsCheck::notEmptyString($name); $code = PsCheck::int($code); if (array_key_exists($code, $this->PAGES)) { PsUtil::raise('\'{}\' is already registered. Cannot register WebPage with same code \'{}\'.', $this->PAGES[$code], $code); } else { $this->PAGES[$code] = new WebPage($path, $name, $code, $authType, $pageCodeNoAccess, $builderIdent); $this->LOGGER->info('+{}. {}', pad_left(count($this->PAGES), 2, ' '), $this->PAGES[$code]); } }
public static function setInt($key, $int) { $_SESSION[$key] = PsCheck::int($int); }
/** * Метод выполняет дамп таблицы */ public static function dumpTable($idColumn, $table, array $where = array(), $order = null) { //Стартуем секундомер $secundomer = Secundomer::startedInst("Снятие дампа {$table}"); //Отключим ограничение по времени PsUtil::startUnlimitedMode(); //Получим экземпляр логгера $LOGGER = PsLogger::inst(__CLASS__); //Текущий пользователь $userId = AuthManager::getUserIdOrNull(); //Для логов, запросов и все остального $table = strtoupper(PsCheck::tableName($table)); //Макс кол-во записей $limit = PsDefines::getTableDumpPortion(); //Проверим наличие id $idColumn = PsCheck::tableColName($idColumn); $LOGGER->info('Dumping table {}. Id column: {}, limit: {}. User id: {}.', $table, $idColumn, $limit, $userId); //Получаем лок (без ожидания) $lockName = "DUMP table {$table}"; $locked = PsLock::lock($lockName, false); $LOGGER->info('Lock name: {}, locked ? {}.', $lockName, var_export($locked, true)); if (!$locked) { return false; //Не удалось получить лок } $zipDi = false; try { //ЗПРОСЫ: //1. Запрос на извлечение колва записей, подлежащих дампированию $queryCnt = Query::select("count({$idColumn}) as cnt", $table, $where); //2. Запрос на извлечение данных, подлежащих дампированию $queryDump = Query::select('*', $table, $where, null, $order, $limit); //3. Запрос на извлечение кодов дампируемых записей $selectIds = Query::select($idColumn, $table, $where, null, $order, $limit); //4. Запрос на удаление дампированных данных $queryDel = Query::delete($table, Query::plainParam("{$idColumn} in (select {$idColumn} from (" . $selectIds->build($delParams) . ') t )', $delParams)); //Выполним запрос для получения кол-ва записей, подлежащих дампу $cnt = PsCheck::int(array_get_value('cnt', PSDB::getRec($queryCnt, null, true))); $LOGGER->info('Dump recs count allowed: {}.', $cnt); if ($cnt < $limit) { $LOGGER->info('SKIP dumping table, count allowed ({}) < limit ({})...', $cnt, $limit); $LOGGER->info("Query for extract dump records count: {$queryCnt}"); PsLock::unlock($lockName); return false; } //Время дампа $date = PsUtil::fileUniqueTime(false); $time = time(); //Название файлов $zipName = $date . ' ' . $table; //Элемент, указывающий на zip архив $zipDi = DirManager::stuff(null, array(self::DUMPS_TABLE, $table))->getDirItem(null, $zipName, PsConst::EXT_ZIP); $LOGGER->info('Dump to: [{}].', $zipDi->getAbsPath()); if ($zipDi->isFile()) { $LOGGER->info('Dump file exists, skip dumping table...'); PsLock::unlock($lockName); return false; } //Комментарий к таблице $commentToken[] = "Date: {$date}"; $commentToken[] = "Time: {$time}"; $commentToken[] = "Table: {$table}"; $commentToken[] = "Manager: {$userId}"; $commentToken[] = "Recs dumped: {$limit}"; $commentToken[] = "Total allowed: {$cnt}"; $commentToken[] = "Query dump cnt: {$queryCnt}"; $commentToken[] = "Query dump data: {$queryDump}"; $commentToken[] = "Query dump ids: {$selectIds}"; $commentToken[] = "Query del dumped: {$queryDel}"; $comment = implode("\n", $commentToken); //Начинаем zip и сохраняем в него данные $zip = $zipDi->startZip(); $zip->addFromString($zipName, serialize(PSDB::getArray($queryDump))); $zip->setArchiveComment($comment); $zip->close(); $LOGGER->info('Data successfully dumped, zip comment:'); $LOGGER->info("[\n{$comment}\n]"); //Удалим те записи, дамп которых был снят $LOGGER->info('Clearing dumped table records...'); $affected = PSDB::update($queryDel); $LOGGER->info('Rows deleted: {}.', $affected); $LOGGER->info('Dumping is SUCCESSFULLY finished. Total time: {} sec.', $secundomer->stop()->getAverage()); } catch (Exception $ex) { PsLock::unlock($lockName); ExceptionHandler::dumpError($ex); $LOGGER->info('Error occured: {}', $ex->getMessage()); throw $ex; } return $zipDi; }
/** * Метод удаляет аватар (с удалением загруженной картинки) */ public function deleteUserAvatar($userId, $avatarId) { $avatarId = PsCheck::int($avatarId); UserBean::inst()->unsetUserAvatar($userId, $avatarId); return AvatarUploader::inst()->deleteUploadedFile($avatarId, $userId); }
public static function userActivityInterval() { return PsCheck::int(self::getPropCheckType(self::GROUP_USER_INTERACTION, 'activity-interval', array(PsConst::PHP_TYPE_STRING))); }