Ускорение на 2%

Рейтинг: 34.4301  
Внедрено
Предложил Щукин Олег 13.03.2014 23:01:20

Ускорение на 2%

Если в функции getLocalPath() (в файле /bitrix/modules/main/tools.php) добавить статическую переменную, содержащую наличие каталога local, то общее количество вызовов file_exists() можно уменьшить примерно на 25% (что соответствует примерно 2% общей нагрузки сервера).
function getLocalPath($path, $baseFolder = "/bitrix")
{
   $root = rtrim($_SERVER["DOCUMENT_ROOT"], "\\/");
   
   static $haveLocalDir = null;
   if( $haveLocalDir === null )
      $haveLocalDir = is_dir($root."/local");

   if ($haveLocalDir && file_exists($root."/local/".$path))
   {
      return "/local/".$path;
   }
   elseif (file_exists($root.$baseFolder."/".$path))
   {
      return $baseFolder."/".$path;
   }
   return false;
}

Актуально для всех продуктов с ядром D7 (по-моему, начиная с версии главного модуля 14.0.1).

Обсуждение в моем разделе

Рейтинг: 0.6236  
Dumbravanu Vadim 14.03.2014 13:30:44
Спасибо, выглядит разумно.
Рейтинг: 0  
Постоев Олег 14.03.2014 18:19:32
Очень интересно, поясните пожалуйста вот этот момент:
static $haveLocalDir = null;
if( $haveLocalDir === null )
Зачем сначала обнулять переменную, а затем проверять обнулена ли она? Какой смысл в проверке?
Рейтинг: 0  
Щукин Олег 15.03.2014 16:49:46
Зачем сначала обнулять переменную, а затем проверять обнулена ли она? Какой смысл в проверке?
При создании одной страницы, функция getLocalPath() вызывается сотни раз.
При помощи ключевого слова static переменная инициализируется значением null только при первом вызове функции, и значение этой переменной сохраняется между последующими вызовами функции getLocalPath().
Проверяя на null, мы определяем первый вызов. Функция is_dir() возвращает булево значение (true или false, но не null). Поэтому при следующих вызовах функции getLocalPath() функция is_dir() вызываться уже не будет.
Рейтинг: 0  
Щукин Олег 15.03.2014 16:53:59
Кстати, $root можно брать из другой static-переменной:
$root = \Bitrix\Main\Loader::getDocumentRoot();
Не знаю, надо ли для такой мелочи создавать отдельную идею?
Рейтинг: 0.5565  
Маджугин Александр 15.03.2014 23:56:58
Кстати, $root можно брать из другой static-переменной
Кстати, если посмотреть в tools.php то там вообще хватает таких мест где можно прикрутить стат-переменные. Еще немного озадачивают меня два момента - почему повсеместно используются двойные кавычки вместо одинарных и вот такие места:

$ALL_LANG_FILES[] = $before.$lang.$after;
   if(file_exists($before.$lang.$after))
      return $before.$lang.$after;
   if(file_exists($before."en".$after))
      return $before."en".$after;
 
зачем так много конкатенаций? Я бы создал здесь переменную. Я понимаю что все это мелочи, которые только чисто теоретически могут дать какой-то прирост производительности, а на практике совершенно неважны, но всё же...