コード例 #1
0
ファイル: PsImgEditor.php プロジェクト: ilivanoff/www
 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();
     }
 }
コード例 #2
0
ファイル: PsProfiler.php プロジェクト: ilivanoff/ps-sdk-dev
 private function __construct()
 {
     $this->CAHCE = new SimpleDataCache();
     $this->enabled = PsDefines::isProfilingEnabled();
     $this->dirManager = DirManager::autogen('profilers');
     if ($this->enabled) {
         PsShotdownSdk::registerDestructable($this, PsShotdownSdk::PsProfiler);
     }
 }
コード例 #3
0
 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);
 }
コード例 #4
0
ファイル: ExternalProcess.php プロジェクト: ilivanoff/www
 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;
 }
コード例 #5
0
ファイル: PSSmarty.php プロジェクト: ilivanoff/ps-sdk-dev
 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);
 }
コード例 #6
0
ファイル: Autoload.php プロジェクト: ilivanoff/ps-sdk-dev
 /**
  * КОНСТРУКТОР
  */
 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);
     }
 }
コード例 #7
0
ファイル: AutoloadDir.php プロジェクト: ilivanoff/www
 public function __construct(DirItem $dir)
 {
     $this->LOGGER = Autoload::getLogger();
     $this->classesDir = $dir;
     $this->classPathFile = DirManager::autogen('classpath')->getDirItem(null, unique_from_path($dir->getRelPath()));
 }
コード例 #8
0
ファイル: PsMailSender.php プロジェクト: ilivanoff/ps-sdk-dev
 /**
  * Метод сохраняет последний удачно отправленный 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);
     }
 }
コード例 #9
0
ファイル: MosaicImage.php プロジェクト: ilivanoff/www
 /** @return DirItem */
 private function diDst()
 {
     return DirManager::autogen('mosaic')->getDirItem(null, $this->id, 'jpg');
 }
コード例 #10
0
ファイル: PageFinaliserRegExp.php プロジェクト: ilivanoff/www
 /**
  * Метод получает на вход 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();
 }
コード例 #11
0
 /**
  * Метод сохраняет ошибку выполнения в файл
  * 
  * @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()}]");
     }
 }
コード例 #12
0
ファイル: CssSprite.php プロジェクト: ilivanoff/ps-sdk-dev
 /**
  * Пусть к воркспейсу, в котором производится работа со спрайтом
  * 
  * @return DirManager
  */
 public static function autogenWs($subDirs = null)
 {
     return DirManager::autogen(array(DirManager::DIR_SPRITES, $subDirs));
 }
コード例 #13
0
ファイル: CssSprite.php プロジェクト: ilivanoff/www
 /**
  * Пусть к воркспейсу, в котором производится работа со спрайтом
  * 
  * @return DirManager
  */
 public static function autogenWs($subDirs = null)
 {
     return DirManager::autogen(array('sprites', $subDirs));
 }
コード例 #14
0
ファイル: Autoload.php プロジェクト: ilivanoff/www
 /**
  * КОНСТРУКТОР
  */
 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);
 }
コード例 #15
0
ファイル: process.php プロジェクト: ilivanoff/ps-sdk-dev
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
}
コード例 #16
0
ファイル: PsMailSender.php プロジェクト: ilivanoff/www
 /**
  * Метод сохраняет последний удачно отправленный 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);
 }
コード例 #17
0
ファイル: FoldedResources.php プロジェクト: ilivanoff/www
 /** @return DirManager */
 public function getAutogenDm($ident, $subDir = null)
 {
     $this->assertHasAccess($ident);
     $this->checkEntityChanged($ident);
     return DirManager::autogen(array('folded', $this->getFoldingGroup(), $ident, $subDir));
 }
コード例 #18
0
 /** @return DirManager */
 public function getAutogenDm($ident, $subDir = null)
 {
     return DirManager::autogen(array('folded', $this->getUnique($this->assertExistsEntity($ident)), $subDir));
 }
コード例 #19
0
ファイル: PSCache.php プロジェクト: ilivanoff/www
 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);
 }
コード例 #20
0
ファイル: PsLogger.php プロジェクト: ilivanoff/ps-sdk-dev
 /** @return DirManager */
 public static function DM($dirs = null)
 {
     return DirManager::autogen(array('logs', $dirs));
 }