private function doClean(DirItem $srcDi) { foreach (DirManager::autogen()->getSubDirNames('images') as $dim) { $cacheKey = md5("[{$srcDi}]:[{$dim}]"); $this->CAHCE->remove($cacheKey); DirManager::autogen()->getHashedDirItem("images/{$dim}", $cacheKey, $cacheKey, SYSTEM_IMG_TYPE)->remove(); } }
private function __construct() { $this->CAHCE = new SimpleDataCache(); $this->enabled = PsDefines::isProfilingEnabled(); $this->dirManager = DirManager::autogen('profilers'); if ($this->enabled) { PsShotdownSdk::registerDestructable($this, PsShotdownSdk::PsProfiler); } }
public function __construct() { /** * Подключаем cache lite */ PsLibs::inst()->CacheLite(); /* * Конфигурируем */ $liteOptions = array('readControl' => true, 'writeControl' => true, 'readControlType' => 'md5', 'automaticSerialization' => true, 'cacheDir' => DirManager::autogen('cache-lite')->absDirPath(), 'lifeTime' => ConfigIni::cacheFileLifetime() * 60, 'caching' => true); if (PsLogger::isEnabled()) { PsLogger::inst(__CLASS__)->info('Lite options: {}', print_r($liteOptions, true)); } $this->IMPL = new Cache_Lite($liteOptions); }
private function executeImpl($lifeTimeOnCall, $__FUNCTION__) { if ($this->called) { return $this->executed; //--- } $this->called = true; $LOGGER = PsLogger::inst(__CLASS__); $LOGGER->info("Function [{$__FUNCTION__}] called."); $needProcess = false; $LOCKFILE = DirManager::autogen('service')->getDirItem(null, __CLASS__, 'lock'); if ($LOCKFILE->isFile()) { $lifeTime = $LOCKFILE->getFileLifetime(); $needProcess = !$lifeTime || !$lifeTimeOnCall || $lifeTime >= $lifeTimeOnCall; $LOGGER->info('{} process. Lock file modified {} seconds ago. Process delay: {} seconds.', $needProcess ? 'Need' : 'Not need', $lifeTime, $lifeTimeOnCall); } else { $needProcess = true; $LOGGER->info('Need process. Lock file is not exists.'); } if (!$needProcess) { return $this->executed; //--- } $locked = PsLock::lock(__CLASS__, false); $LOGGER->info('External process lock {} execution.', $locked ? 'acquired, start' : 'not acquired, skip'); if ($locked) { $LOCKFILE->touch(); PsUtil::startUnlimitedMode(); //Отпустим лок, так как внутри он может потребоваться для выполнения других действий, например для перестройки спрайтов PsLock::unlock(); //Начинаем выполнение $this->executed = true; $job = new ExternalProcessJob(); PsProfiler::inst(__CLASS__)->start(__FUNCTION__); $job->execute(); $secundomer = PsProfiler::inst(__CLASS__)->stop(); if ($secundomer) { $LOGGER->info("{$secundomer}"); } } return $this->executed; }
protected function __construct() { PsLibs::inst()->Smarty(); /* * Начиная с версии 5.4 в функции htmlentities параметр encoding был изменён на UTF-8, * до этого момента после применения данного метода к тексту шаблона мы будем получать кракозябру. */ SmartyCompilerException::$escape = is_phpver_is_or_greater(5, 4); //Получим и сконфигурируем экземпляр Smarty $this->smarty = new Smarty(); $this->smarty->compile_check = true; $this->smarty->force_compile = false; //$this->smarty->caching = TRUE; /* * УПРАВЛЯЮЩИЕ ДИРЕКТОРИИ */ //Директории с шаблонами .tpl : PSSmarty::template('common/citata.tpl'); $this->smarty->setTemplateDir(ConfigIni::smartyTemplates()); //Директория, в которую складываются скомпилированные шаблоны $this->smarty->setCompileDir(DirManager::autogen('/smarty/templates_c/')->absDirPath()); //Директория, в которую складываются кеши $this->smarty->setCacheDir(DirManager::autogen('/smarty/cache/')->absDirPath()); //Директория с конфигами $this->smarty->setConfigDir(PATH_BASE_DIR . PS_DIR_INCLUDES . '/smarty/configs/'); //Директории с плагинами - блочными функциями, функциями, модификатор $this->smarty->addPluginsDir(ConfigIni::smartyPlugins()); /* * Импортируем константы некоторых классов, чтобы на них можно было ссылаться через * {$smarty.const.CONST_NAME} */ //PsConstJs::defineAllConsts(); /* * ПОДКЛЮЧИМ ФИЛЬТРЫ */ PSSmartyFilter::inst()->bind($this->smarty); /* * ПОДКЛЮЧАЕМ ПЛАГИНЫ */ PSSmartyPlugin::inst()->bind($this->smarty); }
/** * КОНСТРУКТОР */ private function __construct() { $this->LOGGER = self::getLogger(); $this->AUTOLOAD = array($this, 'load'); $this->COMMON_EXCLUDED_DI = DirManager::autogen('classpath')->getDirItem(null, 'excluded'); $this->SDK_SRC_DIR = PS_DIR_INCLUDES . DIR_SEPARATOR . DirManager::DIR_SRC . DIR_SEPARATOR; /* * Директория src/common должна быть подключена всегда */ $this->registerBaseDir($this->SDK_SRC_DIR . DirManager::DIR_COMMON); /* * Если проект, то подключим проектные общие ресурсы */ if (ConfigIni::isProject()) { $this->registerBaseDir(ConfigIni::projectSrcCommonDir(), false); } }
public function __construct(DirItem $dir) { $this->LOGGER = Autoload::getLogger(); $this->classesDir = $dir; $this->classPathFile = DirManager::autogen('classpath')->getDirItem(null, unique_from_path($dir->getRelPath())); }
/** * Метод сохраняет последний удачно отправленный email */ private function dumpEmail() { if (ConfigIni::emailsMaxDumpCount() > 0) { $DM = DirManager::autogen('emails'); if ($DM->getDirContentCnt() >= ConfigIni::emailsMaxDumpCount()) { $DM->clearDir(); } $DM->getDirItem(null, PsUtil::fileUniqueTime(), 'mail')->putToFile($this); } }
/** @return DirItem */ private function diDst() { return DirManager::autogen('mosaic')->getDirItem(null, $this->id, 'jpg'); }
/** * Метод получает на вход url ресурса и пытается его обфусцировать, если это возможно. * * @return: путь к ресурсу, который должнет быть подключен, или null, если ресурс подключать не нужно */ private function tryReplaceResource($url) { if (!starts_with($url, DIR_SEPARATOR)) { //Это внешний ресурс: http:// и т.д. - подключаем. return $url; } $di = DirItem::inst($url); if (!$di->isFile() || $di->getSize() <= 0) { return null; } if (!PsDefines::isProduction()) { //Не будем пытаться обфусцировать в девелопменте //return $url; } if (!ends_with($url, '.js')) { //Мы не можем обфусцировать .css файлы, так как они используют относительные пути к ресурсам. return $url; } return $url; $url = $di->getRelPath(); if (!starts_with($url, $this->OBFUSCATABLE)) { //Не стоит обфусцировать не наши .js файлы, так как они могут внутри использовать ссылки на рядом лежащие ресурсы return $url; } $type = 'js'; $obfuscatedDi = DirManager::autogen("resources/{$type}")->getDirItem(null, md5($url), $type); $mtyme = $obfuscatedDi->getModificationTime(); if (!$mtyme || $mtyme < $di->getModificationTime()) { $obfuscatedDi->writeToFile(StringUtils::normalizeResourceFile($type, $di->getFileContents()), true); } return $obfuscatedDi->getRelPath(); }
/** * Метод сохраняет ошибку выполнения в файл * * @param Exception $exception */ public static function dumpError(Exception $exception, $additionalInfo = '') { if (ConfigIni::exceptionsMaxDumpCount() <= 0) { return; //--- } $additionalInfo = trim("{$additionalInfo}"); //Поставим защиту от двойного дампинга ошибки $SafePropName = 'ps_ex_dumped'; if (property_exists($exception, $SafePropName)) { return; //--- } $exception->{$SafePropName} = true; try { $INFO[] = 'SERVER: ' . (isset($_SERVER) ? print_r($_SERVER, true) : ''); $INFO[] = 'REQUEST: ' . (isset($_REQUEST) ? print_r($_REQUEST, true) : ''); $INFO[] = 'SESSION: ' . (isset($_SESSION) ? print_r($_SESSION, true) : ''); $INFO[] = 'FILES: ' . (isset($_FILES) ? print_r($_FILES, true) : ''); if ($additionalInfo) { $INFO[] = "ADDITIONAL:\n{$additionalInfo}\n"; } $INFO[] = 'STACK:'; $INFO[] = ExceptionHelper::formatStackFile($exception); $original = ExceptionHelper::extractOriginal($exception); $fname = get_file_name($original->getFile()); $fline = $original->getLine(); $DM = DirManager::autogen('exceptions'); if ($DM->getDirContentCnt() >= ConfigIni::exceptionsMaxDumpCount()) { $DM->clearDir(); } $DM->getDirItem(null, PsUtil::fileUniqueTime() . " [{$fname} {$fline}]", 'err')->putToFile(implode("\n", $INFO)); } catch (Exception $ex) { //Если в методе дампа эксепшена ошибка - прекращаем выполнение. die("Exception [{$exception->getMessage()}] dump error: [{$ex->getMessage()}]"); } }
/** * Пусть к воркспейсу, в котором производится работа со спрайтом * * @return DirManager */ public static function autogenWs($subDirs = null) { return DirManager::autogen(array(DirManager::DIR_SPRITES, $subDirs)); }
/** * Пусть к воркспейсу, в котором производится работа со спрайтом * * @return DirManager */ public static function autogenWs($subDirs = null) { return DirManager::autogen(array('sprites', $subDirs)); }
/** * КОНСТРУКТОР */ private function __construct() { $this->LOGGER = self::getLogger(); $this->AUTOLOAD = array($this, 'load'); $this->COMMON_EXCLUDED_DI = DirManager::autogen('classpath')->getDirItem(null, 'excluded'); $this->registerBaseDir(self::DIR_KIT, false); //TODO $this->registerBaseDir(self::DIR_CLASSES, false); //TODO $this->registerBaseDir('kit', false); }
function executeProcess(array $argv) { $CLASS_PATTERN = file_get_contents(file_path(__DIR__, 'class.txt')); $METHOD_PATTERN = file_get_contents(file_path(__DIR__, 'method.txt')); /* * Название тестового файла. * Для проверки мы сначала удалим класс для него, если он был, потом проверим, что за класс был сгенерирован. */ $TEST_MESSAGES_FILE = 'ExampleSdkProcessMessages'; //Убедимся, что тестовый .msgs существует и удалим тестовый .php файл $TEST_PHP_DI = DirItem::inst(__DIR__ . '/classes', $TEST_MESSAGES_FILE, PsConst::EXT_PHP)->remove(); $TEST_MSGS_DI = DirItem::inst(__DIR__ . '/classes', $TEST_MESSAGES_FILE, PsConst::EXT_MSGS); check_condition($TEST_MSGS_DI->isFile(), "File {$TEST_MSGS_DI->getAbsPath()} must exists"); dolog('Loading all files, ended with Messages.msgs'); //TODO - после нужно получать эту информацию из какого-нибудь места $exceptDirs[] = DirManager::autogen()->relDirPath(); $exceptDirs[] = DirManager::resources()->relDirPath(); $exceptDirs[] = DirManager::stuff()->relDirPath(); //$exceptDirs = array(); $items = DirManager::inst()->getDirContentFull(null, function (DirItem $di) { dolog($di->getAbsPath()); return $di->isFile() && ends_with($di->getName(), 'Messages.msgs'); }, $exceptDirs); dolog('Message files for processing: {}', count($items)); //Проверим, что был выбран тестовый файл check_condition(in_array($TEST_MSGS_DI, $items, true), "Test file [{$TEST_MESSAGES_FILE}] is not included"); //Удалим его из массива... array_remove_value($items, $TEST_MSGS_DI, true); //И поместим наверх, чтобы он был обработан первым array_unshift($items, $TEST_MSGS_DI); /* @var $msgsDi DirItem */ foreach ($items as $msgsDi) { dolog('PROCESSING [{}]', $msgsDi->getAbsPath()); //Сбросим методы $METHODS = array(); //Извлечём название класса $CLASS = $msgsDi->getNameNoExt(); //DirItem файла с сообщениями php $classDi = DirItem::inst($msgsDi->getDirname(), $CLASS, PsConst::EXT_PHP); //Получаем сообщения из файла .msgs $messages = $msgsDi->getFileAsProps(); foreach ($messages as $MSG_KEY => $MGG_VALUE) { dolog(' >> {}={}', $MSG_KEY, $MGG_VALUE); //Получим список всех параметров из макросов ({0}, {1}, {2} и т.д.) preg_match_all("/\\{(.+?)\\}/", $MGG_VALUE, $args); $args = array_values(array_unique($args[1])); sort($args, SORT_NUMERIC); $ARGS = array(); for ($index = 0; $index < count($args); $index++) { $arg = $args[$index]; $lineDescr = PsStrings::replaceWithBraced('[{}] in line [{}={}]', $msgsDi->getRelPath(), $MSG_KEY, $MGG_VALUE); check_condition(is_inumeric($arg), "Invalid argument [{$arg}] for {$lineDescr}"); check_condition($index == $args[$index], "Missing index [{$index}] for {$lineDescr}"); $ARGS[] = '$p' . $index; } $ARGS = join(', ', $ARGS); //Добавляем метод dolog(" A: {}::{} ({})", $CLASS, $MSG_KEY, $ARGS); $PARAMS['SUPPORT_CLASS'] = PsMsgs::getClass(); $PARAMS['MESSAGE'] = $MGG_VALUE; $PARAMS['FUNCTION'] = $MSG_KEY; $PARAMS['ARGS'] = $ARGS; $METHODS[] = PsStrings::replaceMapBracedKeys($METHOD_PATTERN, $PARAMS); } dolog('Made methods: ({})', count($METHODS)); if ($METHODS) { $PARAMS['FILE'] = $msgsDi->getAbsPath(); $PARAMS['CLASS'] = $CLASS; $PARAMS['DATE'] = date(DF_PS); $PARAMS['METHODS'] = "\n" . join("\n\n", $METHODS) . "\n"; $CLASS_PHP = PsStrings::replaceMapBracedKeys($CLASS_PATTERN, $PARAMS); $classDi->putToFile($CLASS_PHP); } /* * Если обрабатываем тестовый файл - проверим его */ //TEST CLASS VALIDATION START >>> if ($msgsDi->equals($TEST_MSGS_DI)) { dolog(''); dolog('Validating test class {}', $TEST_MESSAGES_FILE); //Проверим, что .php был сгенерирован check_condition($TEST_PHP_DI->isFile(), "File {$TEST_PHP_DI->getAbsPath()} was not created!"); //Проверим, что для каждого сообщения был создан метод $methods = PsUtil::newReflectionClass($TEST_MESSAGES_FILE)->getMethods(); $messages = $TEST_MSGS_DI->getFileAsProps(); check_condition(count($methods) == count($messages), 'Methods count missmatch, check ' . $TEST_PHP_DI->getAbsPath()); /* @var $method ReflectionMethod */ foreach ($methods as $method) { check_condition(array_key_exists($method->getName(), $messages), "No method {$TEST_MESSAGES_FILE}::" . $method->getName()); } //Проверим, что возвращают методы тестового сгенерированного класса function doTest($className, $methodName, array $params, $expected) { $method = "{$className}::{$methodName}"; $actual = call_user_func_array($method, $params); dolog("{}({})='{}', Expected='{}'", $method, join(', ', $params), $actual, $expected); check_condition($actual == $expected, "{$actual} != {$expected}"); } doTest($TEST_MESSAGES_FILE, 'message1', array(), 'Message 1'); doTest($TEST_MESSAGES_FILE, 'message2', array('a', 'b', 'c'), 'Parametred a,c,b'); dolog('Test class is valid!'); } //TEST CLASS VALIDATION END <<< } //# DirItems validation end }
/** * Метод сохраняет последний удачно отправленный email */ private function dumpEmail() { $DM = DirManager::autogen('emails'); if ($DM->getDirContentCnt() >= EMAILS_MAX_FILES_COUNT) { $DM->clearDir(); } $DM->getDirItem(null, PsUtil::fileUniqueTime(), 'mail')->putToFile($this); }
/** @return DirManager */ public function getAutogenDm($ident, $subDir = null) { $this->assertHasAccess($ident); $this->checkEntityChanged($ident); return DirManager::autogen(array('folded', $this->getFoldingGroup(), $ident, $subDir)); }
/** @return DirManager */ public function getAutogenDm($ident, $subDir = null) { return DirManager::autogen(array('folded', $this->getUnique($this->assertExistsEntity($ident)), $subDir)); }
protected function __construct() { $this->CACHE = new SimpleDataCache(); $this->LOGGER = PsLogger::inst(__CLASS__); /** * Подключаем cache lite */ ExternalPluginsManager::CacheLite(); $liteOptions = array('readControl' => true, 'writeControl' => true, 'readControlType' => 'md5', 'automaticSerialization' => true, 'cacheDir' => DirManager::autogen('cache')->absDirPath(), 'lifeTime' => CACHE_LITE_LIFE_TIME * 60, 'caching' => true); $this->CACHELITE = new Cache_Lite($liteOptions); $GROUPS = self::getCacheGroups(); $TREE[self::CHILD_FOLDING] = Mappings::CACHE_FOLDINGS()->getAllMappedEntitys($GROUPS); $TREE[self::CHILD_DBENTITY] = Mappings::CACHE_DBENTITYS()->getAllMappedEntitys($GROUPS); $this->TREE = new PSCacheTree($this->LOGGER, $TREE); }
/** @return DirManager */ public static function DM($dirs = null) { return DirManager::autogen(array('logs', $dirs)); }