Ищем неиспользуемые расширения PHP

    image

    Одним из способов ускорения работы интерпретатора PHP является отключение неиспользуемых расширений.
    Конечно же прирост производительности будет незначителен, но отключение расширений не занимает много времени, поэтому есть смысл воспользоваться данным способом.

    Главной проблемой будет найти неиспользуемые расширения, для этих целей я написал небольшую утилитку, которая поможет вам в этом деле.

    Утилитка имеет cli-интерфейс и вызывается следующим образом:
    php -f php_unused_extensions_scanner.php <путь к директории с php-проектами>

    Утилита работает следующим образом:
    • С помощью рефлексии получает из загруженных расширений имена классов, функций и констант
    • Ищет все php-файлы в указанной директории
    • Ищет полученные имена в коде php-скриптов

    Результатом работы будет список расширений, извлеченные ключевые слова из которой нигде обнаружены не были — теперь их можно отключить.
    Учтите что некоторые расширения не предназначены для вызова из скриптов, а является, так сказать «сервисными» (xDebug, eAccelerator, APC и подобные).
    Поэтому будьте внимательны при их отключении и затем не забудьте проверить работоспособность скриптов.

    Взять утилиту можно с гитхаба.
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 18
    • +1
      А если проект использует
      $v = 'xdebug_var_dump';
      $v('test');
      

      для примера, то мы отключим по логике xdebug.

      Ну и таких способов — миллион. Например, можно еще использовать eval.
      • –2
        Согласен, сканер не гарантирует 100% точности.
        И наоборот — к примеру, имена функций могут храниться в базе и в коде вызываться динамически.

        Поэтому надо перед отключением хотя бы проанализировать список самому.
        • 0
          Имхо, такому проекту уже ничего не поможет.
          • 0
            call_user_function тоже криминал?
            • 0
              нет, это не криминал. Но, это разные вещи.

              Если я увижу в коде call_user_function — я буду знать, что сейчас будет вызвана функия (или метод класса). Причем сразу видно имя функции / метода.

              Если я увижу в коде $v('test') — то сейчас должно произойти? $v — это функция или объект?
              Кстати, IDE в данном случае корректо отработает, если это будет объект и запутается, если это будет функция.
              • +1
                $v('test') — это функция, всегда, объектом может быть только new $v('test'), чтобы у объекта работал $v('test') у него должен быть метод __invoke, который, о чудо, заставляет объект эмулировать функцию. call_user_function нужен если есть нужда вызывать методы объектов в виде array($object, 'method'), но и накладные расходы при вызове у него больше, так как это функция, а variable functions — языковая конструкция.
                • 0
                  А как же кложур? $v = function($c){ echo $c; }; $v('test'); Вот вам и без new $v :)
                  • –1
                    Капитан подсказывает, что это анонимная функция
                    • –1
                      По сути она является объектом Closure. Но да, можно считать её функцией. Просто вызывается вышеупомянутый __invoke из объекта вот и все дела с «функцией».
                  • 0
                    $v('test') — это функция, всегда, объектом может быть только new $v('test'), чтобы у объекта работал $v('test') у него должен быть метод __invoke


                    Ну да, вы повторяете очевидные вещи, которые описаны по ссылке, которую я привел в комментарии выше. И наличие у объекта метода __invoke не должно удивлять, например, в zend framework 2 он используется.

                    Только, повторюсь. $v('test') не всегда функция, вот пример из документации:
                    class CallableClass
                    {
                        public function __invoke($x)
                        {
                            var_dump($x);
                        }
                    }
                    $v = new CallableClass;
                    
                    $v(5);
                    


                    Соответственно, как я и писал, если в коде встретить

                    $v('test');
                    


                    то непонятно, это функция или объект.
                    • 0
                      Нет, вы что, издеваетесь, а call_user_func($v) — здесь вам понятно функция это или объект?
                      • 0
                        У меня складывается впечатление, что мы говорим о разных вещах.
                        call_user_func(string) — функция
                        call_user_func(array) — метод объекта

                        Или я не правильно понял вопрос?
                        • 0
                          А также call_user_func(любой объект с методом __invoke, включая Closure).
          • +1
            Замеры не делали?
            • 0
              Нет
              • +1
                Без цифр — в статье нет смысла. Если прирост на уровне 1-2% смысла дёргаться нет. Если хотя бы 10% — можно подумать
                • 0
                  Не соглашусь. Все зависит от проекта. Даже если прирост будет в 0.1%, умножаем его на пару миллионов запросов в сутки = экономия процессорного времени, ради которой стоит этим заняться.
            • НЛО прилетело и опубликовало эту надпись здесь

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое