Задать вопрос
AotD
@AotD
PHP, Redis, Postgresql

PHP скрипт — определение необходимых extensions

Задачка проста и банальна:
Новый сервер с чистой установкой php.
Скрипт активно пользующийся всякими вкусностями типа SOAP, json_encode и прочими благами цивилизации.
Необходимо поставить только нужные расширения.

Решение которое родилось у меня:
1) На сервере с полным фаршем расширений, где скрипт будет работать 100% составляем список доступных (get_loaded_extensions).
2) Составляем список функций и констант для каждого (get_extension_funcs, get_defined_constants)
3) Поиск этих функций и констант по проекту (find, grep и прочие извращения)
4) Имеем готовый список необходимых расширений.
Минус: расширения добавляющие только классы (xmlreader к примеру) не будут идентифицированы, т.к. классы не попадут в вывод get_extension_funcs

Есть ли готовое решение «ис каропки» для проведения аудита кода и составления списка необходимых расширений? Или как можно решить эту задачу другим способом?
  • Вопрос задан
  • 2579 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
AotD
@AotD Автор вопроса
PHP, Redis, Postgresql
А вот и вариантец Статический анализ PHP-кода с помощью HipHop.
Т.к. идет попытка компиляции — все ветки просматриваются де-факто.
Схема: Выключаем всё, компилим, ловим ошибку, включаем нужное.
Минусы очевидны — собрать hiphop, настроить автоматизированную среду компиляции и включения/отключения модулей. Не факт что оно вообще будет компилить ваш проект.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Dzuba
@Dzuba
Об указанных Вами минусах: посмотрите в сторону get_declared_classes и get_class_methods.
Ответ написан
taliban
@taliban
php программист
Если поставите голый пхп, он сам скажет что ему надо.
Ответ написан
Zyava
@Zyava
Если у вас ООП приложение, то можно попробовать следующий способ:
0. Отключаем все расширения в пхп.ини.
1. Составляем список всех расширений пхп в виде массива, устанавливаем свой обработчик ошибок через ua.php.net/manual/en/function.set-error-handler.php.
2. Грузим все расширения в рантайме с помощью php.net/manual/en/function.dl.php
3. Загружаем все классы, все файлы какие можно.
4. Повторяем пункты 2-3, по очереди не загружая одно из расширений. Если вылетит эксепшн или ошибка — значит не загруженное расширение используется.

Покрытие конечно не 100% т.к. все файлы загрузить не получится (в тех же вьюхах, если их напрямую грузить, посыпятся ошибки).
Ответ написан
Комментировать
conf
@conf
Ruby developer
Вам может помочь PHP_CompatInfo и его текущий мейнтейнер mekras.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы