/** * Метод убеждается в том, что провайдер безопасности установлен. * Наша задача - установить провайдер один раз и проверить, чтобы он больше не менялся. */ public static function init() { self::$inited = check_condition(!self::$inited, 'Cannot initialize ' . __CLASS__ . ' twice'); if (self::$provider instanceof PsSecurityProvider) { //Провайдер безопастности был уже установлен } else { check_condition(is_null(self::$provider), __CLASS__ . ' is not correctly initialized'); if (PsContext::isCmd()) { //Если работаем под процессом - установим специальный провайдер безопастности self::$provider = new PsSecurityProviderCmd(); } else { //Устанавливаем базовый провайдер безопасности на основе сессии self::$provider = new PsSecurityProviderSdk(); } } check_condition(!PsContext::isCmd() || self::$provider instanceof PsSecurityProviderCmd, 'Invalid security provider for cmd process'); $LOGGER = PsLogger::inst(__CLASS__); if ($LOGGER->isEnabled()) { $LOGGER->info('Context: {}', PsContext::describe()); $LOGGER->info('Provider: {}', get_class(self::$provider)); $LOGGER->info('Is authorized: {}', var_export(self::$provider->isAuthorized(), true)); $LOGGER->info('Is admin: {}', var_export(self::$provider->isAuthorizedAsAdmin(), true)); $LOGGER->info('User ID: {}', self::$provider->getUserId()); } }
/** * Метод вызывается для инициализации окружения: * 1. Директория ресурсов окружения будет подключена в Autoload * 2. Файл, включающий окружение, будет выполнен */ public static function init() { if (self::$inited) { return; //--- } self::$inited = true; //--- /* * Проверим, нужно ли подключать окружение */ if (self::isSkipInclude()) { return; //--- } $env = self::env(); if (!$env) { return; //--- } $envDir = array_get_value($env, ConfigIni::environments()); if (!$envDir) { return PsUtil::raise('Environment [{}] not found', $env); } if (!is_dir($envDir)) { return PsUtil::raise('Environment dir for [{}] not found', $env); } $envSrcDir = next_level_dir($envDir, DirManager::DIR_SRC); $envIncFile = file_path($envDir, $env, PsConst::EXT_PHP); if (!is_file($envIncFile)) { return PsUtil::raise('Environment include file for [{}] not found', $env); } $LOGGER = PsLogger::inst(__CLASS__); if ($LOGGER->isEnabled()) { $LOGGER->info('Including \'{}\' environment for context \'{}\'', $env, PsContext::describe()); $LOGGER->info('Env dir: {}', $envDir); $LOGGER->info('Src dir: {}', $envSrcDir); $LOGGER->info('Inc file: {}', $envIncFile); } //Проинициализировано окружение self::$included = true; //Регистрируем директорию с классами, специфичными только для данного окружения Autoload::inst()->registerBaseDir($envSrcDir, false); //Выполним необходимое действие $PROFILER = PsProfiler::inst(__CLASS__); try { $LOGGER->info('{'); $PROFILER->start($env); self::initImpl($LOGGER, $envIncFile); $secundomer = $PROFILER->stop(); $LOGGER->info('}'); $LOGGER->info('Inc file included for {} sec', $secundomer->getTime()); } catch (Exception $ex) { $PROFILER->stop(false); $LOGGER->info('Inc file execution error: [{}]', $ex->getMessage()); throw $ex; //--- } }
/** * При инициализации: * 1. Получим из файла номер сессии * 2. Почистим/создадим директорию для логирования */ public function initAndWriteFirstLog() { $DM = PsLogger::DM(); $num = PsSequence::LOG()->next(); $num = pad_left("{$num}", 2, '0'); $logDirName = "session {$num}"; $DM->cd(null, $logDirName)->clearDir(); $fileCommon = $DM->absFilePath(null, '!session ' . $num, 'txt'); //Сделаем первую запись $date = date(DF_PS); $this->doAppend($fileCommon, self::SEPARATOR . " {$num}. [{$date}] " . self::SEPARATOR); $this->doAppend($fileCommon, 'SERVER: ' . (isset($_SERVER) ? print_r($_SERVER, true) : '')); $this->doAppend($fileCommon, 'REQUEST: ' . (isset($_REQUEST) ? print_r($_REQUEST, true) : '')); $this->doAppend($fileCommon, 'SESSION: ' . (isset($_SESSION) ? print_r($_SESSION, true) : '')); $this->doAppend($fileCommon, 'FILES: ' . (isset($_FILES) ? print_r($_FILES, true) : '')); $this->doAppend($fileCommon, 'CTXT: ' . PsContext::describe()); //Установим переменные класса $this->sessionDM = $DM; $this->sessionNUM = $num; $this->fileCommon = $fileCommon; }
foreach ($exception->getTrace() as $num => $stackItem) { $str = $num . '# ' . (array_key_exists('file', $stackItem) ? $stackItem['file'] : '') . ' (' . (array_key_exists('line', $stackItem) ? $stackItem['line'] : '') . ')'; dolog(pad_left('', $num, ' ') . $str); } dolog(''); die(1); } restore_exception_handler(); set_exception_handler('print_stack'); //Параметр $CALLED_FILE должен установлен запущенным процессом check_condition($CALLED_FILE, 'Global variable $CALLED_FILE is not set'); check_condition(is_file($CALLED_FILE), "Programm file {$CALLED_FILE} is not found"); //Функция должна быть определена запущенным процессом check_condition(is_callable(PS_PROCESS_FUNCTION_NAME), PS_PROCESS_FUNCTION_NAME . ' is not callable'); //Проверим, что программа вызвана из командной строки check_condition(is_array($argv) && PsContext::isCmd(), "Programm {$CALLED_FILE} can be runned only from console"); //В необязательном режиме подключим папку src нашего процесса Autoload::inst()->registerBaseDir(array(dirname($CALLED_FILE), DirManager::DIR_SRC), false); //Определим вспомогательную функцию логирования function dolog($info = '') { call_user_func_array(array(PsLogger::inst('PROCESS'), 'info'), func_get_args()); } //Заругистрируем функцию, которая после окончания процесса запишет лог в файл function dimpConsoleLog() { global $CALLED_FILE; if ($CALLED_FILE) { $log = file_path(dirname($CALLED_FILE), get_file_name($CALLED_FILE), 'log'); $FULL_LOG = PsLogger::controller()->getFullLog(); $FULL_LOG = mb_convert_encoding($FULL_LOG, 'UTF-8', 'cp866');
/* * Зарегистрируем наш обработчик для php ошибок */ ExceptionHandler::register4errors(); /* * Подключим обработчик эксепшенов. Позднее мы подключим "красивый" обработчик ошибок. */ ExceptionHandler::register(); /* * Подключим загрузчик служебных классов */ Autoload::inst()->register(); /* * Если мы работаем под процессом - не подключаемся автоматически к DB и используем специальный провайдер безопасности */ if (PsContext::isCmd()) { /* * Установим специальный провайдер безопасности для консольного процесса */ PsSecurity::set(new PsSecurityProviderCmd()); } else { /* * Автоматически подключаемся к БД */ PsConnectionPool::configure(PsConnectionParams::production()); } /* * Инициализируем окружение, если мы работаем под ним. * Подключаемое окружение может установить свой провайдер безопасности. * Важно! Вызов не перемещать в if, так как метод init должен быть вызван обязательно. */