/** * Метод убеждается в том, что провайдер безопасности установлен. * Наша задача - установить провайдер один раз и проверить, чтобы он больше не менялся. */ 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()); } }
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');
/** * Метод проверяет, нужно ли подключать окружение. */ private static function isSkipInclude() { return PsContext::isCmd(); }
/* * Зарегистрируем наш обработчик для php ошибок */ ExceptionHandler::register4errors(); /* * Подключим обработчик эксепшенов. Позднее мы подключим "красивый" обработчик ошибок. */ ExceptionHandler::register(); /* * Подключим загрузчик служебных классов */ Autoload::inst()->register(); /* * Если мы работаем под процессом - не подключаемся автоматически к DB и используем специальный провайдер безопасности */ if (PsContext::isCmd()) { /* * Установим специальный провайдер безопасности для консольного процесса */ PsSecurity::set(new PsSecurityProviderCmd()); } else { /* * Автоматически подключаемся к БД */ PsConnectionPool::configure(PsConnectionParams::production()); } /* * Инициализируем окружение, если мы работаем под ним. * Подключаемое окружение может установить свой провайдер безопасности. * Важно! Вызов не перемещать в if, так как метод init должен быть вызван обязательно. */