Если в функции getLocalPath() (в файле /bitrix/modules/main/tools.php) добавить статическую переменную, содержащую наличие каталога local, то общее количество вызовов file_exists() можно уменьшить примерно на 25% (что соответствует примерно 2% общей нагрузки сервера).
Актуально для всех продуктов с ядром D7 (по-моему, начиная с версии главного модуля 14.0.1).
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).
Смотрю, смотрю и никак не могу понять почему 25%, а не 50. Разъясните.
Приведенные цифры получены при профилировании создания детальной страницы каталога (
Имеем 661 вызов file_exists(), которые потребляют 9.4% процессорного времени. И них 318 вызовов (48.1%) произведено из getLocalPath().
После изменения getLocalPath(), очевидно уменьшение числа этих вызовов вдвое внутри getLocalPath(), что составляет 48.1/2=24.05% от общего числа вызовов. Арифметика как-бы намекает, что нагрузка на процессор уменьшится на 9.4%/(100/24.05)=2,26% (в сообщении я написал 2%).
Вы можете увидеть, где я слукавил:
- в том, что округлил 24.05% в большую сторону;
- в том что применил арифметику для подсчета уменьшения нагрузки;
- и, главное, в том, что рассмотрел только один частный случай, выдавая его за общее поведение.
Но, надеюсь, вы будете ко мне снисходительны
Конечно, внутри getLocalPath() количество вызовов file_exists() уменьшится почти вдвое. Но в сообщении я писал об общем числе вызовов file_exists() из Битрикса.
Очень годное исправление. Хорошо, что кто-то иногда заглядывает в ядро.