Задать вопрос

Хочу, чтобы в модуле виделись глобальные переменные скрипта, возможно ли?

Пишу программу с примерно такой архитектурой:
/global.cgi - инициализирующий скрипт, ловящий переменную с задачей и решающей, какой модуль подгрузить (action.pm)
/lib/module.pm - модуль часто используемых функций
/lib/action1.pm - модуль конкретной задачи
/lib/action2.pm - модуль конкретной задачи
/lib/action3.pm - модуль конкретной задачи

В базе хранятся настройки, которые получает из базы global.cgi и сохраняет их в глобальных хэш. Так вот, необходимо, чтобы этот кеш был виден и в других модулях. Конечно можно передавать ссылку на хэш в каждой функции, но это геморройно, т.к. по идее инициализирует программу global.cgi, который обращается к функции из action.pm, которая пользуется функциями из module.pm и везде нужен этот хэш.
Раньше этот хэш инициализировался в module.pm и импортировался, однако сайт работает под mod_perl и когда запустили копию сайта с другими настройками, получилось, что иногда сайт 1 получал настройки сайта 2. Скорее всего mod_perl видел, что библиотека lib::module уже загружена и импортировал настройки ее, а они допустим первого сайта. Из-за этого решил получение настроек перенести в корневой скрипт global.cgi, однако не понимаю, как передавать настройки модулям. Возможно, можно было просто lib::module сделать объектно-ориентированным и тогда не было бы проблем с mod_perl, но я с ООП не дружу и не знаю, верны ли мои суждения. Знаю, только что есть %ENV, который виден во всех модулях, поэтому есть надежда, что такое можно реализовать. Если у вас есть мысли, как такое сделать, то буду благодарен. Если непонятно написал, напишите, я попробую подробнее объяснить. Уже тонны информации перерыл, но пока безрезультатно.
  • Вопрос задан
  • 3347 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
ksusha
@ksusha
Сделайте отдельный кэширующий модуль, куда поместите переменную с кэшем и всякие стандартные методы для работы с ним (get, set итп), далее поместите настройки и закэшированные данные разных сайтов в кэш под разными ключами, и при каждом клике просто назначайте данные по нужному ключу текущими. Т.е. будет глобальный кэш для всех и кэш для конкретного сайта. Можно сделать переменные кэша доступными везде, но лучше сделать доступ к ним через функции кэширующего модуля.

PS Объектно-ориентированность модуля конкретно в этой задаче вам ничем не поможет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SLY_G
@SLY_G
журналист, переводчик, программист, стартапщик
Ну, раз хеш с настройками надо передавать — его надо передавать.
Если инициализатор подргужает модули согласно принятым командам, наверно это делается в одном месте скрипта и непонятно, в чём тут такая проблема Ж)
Ну передаст он первым параметром эту ссылку на хэш…

Если будет ООП, тогда это будет не передача параметра функции, а вызов конструктора с инициализацией этими параметрами, в общем форма поменяется.

Как вариант, можно сохранять этот хеш в файле/базе данных, а в модулях загружать.
Ответ написан
@afandiman
Возможно это именно то, что вам нужно
perldoc.perl.org/functions/our.html
Ответ написан
Ваш ответ на вопрос

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

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