Как стать автором
Обновить

Клиентские и CGI программы на PHP с едиными переменными окружения в bash_profile

Время на прочтение 3 мин
Количество просмотров 1.5K
Работаю на работе над разными небольшими проектами. Решил поделиться с вами тем что делаю, так как мне кажется, что я пошел по ложному пути или занимаюсь совсем уж извращенством :-)

Речь пойдет о том, как можно использовать переменные окружения, описанные в файле ~/.bash_profile в программах на PHP, и о том, как сопоставить каталог пользователя ОС с URL из серверного PHP процесса, для того чтобы интерпретатор PHP подключал классы именно из этого каталога. Все это нужно для того чтобы рабочая версия проекта лежала в домашней директории одного пользователя, а тестовые версии — в домашних директориях других пользователей.

В общем, так получилось, что на сервере, на котором ведутся разработки, есть два (а до этого было и три) пользователя в ОС Solaris. Еще есть SVN. Еще есть СУБД (в данном случае не важно какая). В домашней директории каждого пользователя находится рабочая копия, но есть один особенный пользователь… У этого пользователя всегда находится рабочая отлаженная версия файлов, скриптов и всего остального. Во всех остальных директориях ведется разработка.
Теперь немного подробнее о том, что находится в рабочих копиях (они же домашние директории). В них есть:
  • несколько клиентских PHP программ
  • несколько CGI PHP программ для WEB
  • набор PHP классов для клиентских и WEB программ
  • несколько bash программ
  • файл .bash_profile, в котором описанны переменные окружения для всех вышеописанных программ

Файл .bash_profile используется как хранилище переменных окружения, которые нужны во всех скриптах. Так исторически сложилось. Кроме того, я нахожу это удобным решением в данных обстоятельствах. В bash программах переменные окружения используются отлично. В клиентских PHP программах используется функция getenv(). А вот в CGI программах на PHP… Это и есть самая интересная часть заметки.

Если в программах на языке bash и в клиентских приложениях PHP можно использовать переменную $USER и функцию getenv('USER') соответственно, то в случае с CGI PHP все сложнее. Ситуация осложняется тем, что процесс WEB-сервера никак не связан с пользователями ОС. Пришлось изобретать. Некоторые варианты решения проблемы привязки текущего процесса PHP при выполнении его WEB-сервером такие:
  • завести одноименные поддомены для каждого пользователя ОС и в дальнейшем при запросе брать имя пользователя из названия поддомена (в моем случае, второго уровня) из массива $_SERVER
  • завести одноименные поддиректории, а последнюю часть URL использовать как имя пользователя ОС

Получается, что передавать информацию об имени пользователя можно только через URL. Мной был выбран второй способ, наверное, потому что поддомены заводить было лень.
Таким образом, после реализации сего хитрого механизма, о которой я расскажу ниже, при заходе по адресу вида http://server/production/ PHP программа:
  1. берет последнюю часть URL
  2. ищет в ФС директорию /home/production
  3. добавляет в переменную include_path путь /home/production/php/include (в которой содержатся классы)
  4. cчитывается файл .bash_profile выбранного пользователя (/home/production/.bash_profile)
  5. в нем функцией preg_match ищутся переменные окружения и заносятся в массив $_ENV
  6. далее классы подключаются обработчиком __autoload в котором есть некоторые специфические обработчики

production — имя пользователя, у которого лежат проверенные рабочие файлы и программы. У остальных пользователей (user1, user2 и т.д.), как уже упоминалось, рабочие копии в которых ведется разработка. Таким образом имеем классы, подключенные из директории нужного пользователя, и переменные окружения из .bash_profile.

Кроме того, есть еще БД, со схемами, названными парами * и *_test. Например, stat и stat_test. Программы, запускаемые от пользователя production, подключаются к схемам первого вида, все остальные пользователи — к схемам второго, используя их для отладки с тестовыми наборами данных. Кроме того, PHP программы из директории пользователя production, запущенные с ключем --test, будут обращаться к схемам вида *_test, что сделано для удобства отладки.

Надеюсь, что объяснил понятно. Еще раз подчеркну, что вышеописанное не стоит воспринимать как совет или руководство, да и повторять тоже не надо, так как это частное и очень специфическое решение, которым я пользуюсь. Эту заметку стоит понимать как рассказ о повседневном программировании на PHP или как фантастический рассказ :-)
Теги:
Хабы:
+2
Комментарии 2
Комментарии Комментарии 2

Публикации

Истории

Работа

PHP программист
175 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн