我有一个web应用程序,我在mod_perl 2中编写。(这是一个自定义处理程序模块,而不是注册表或perlrun脚本。)我希望在服务器初始化时设置几个配置选项,最好是从配置文件中设置。我遇到的问题是,我还没有找到一个好地方来传递我的应用程序的配置文件的文件名。
我第一次尝试加载"./app.conf",但当前目录不是模块的位置,所以它是不可预测的,容易出错。或者,我必须假设一条路径,相对的或绝对的。这是不灵活的,如果主机操作系统发行版发生了变化,可能会出现问题。我不想硬编码一个路径(虽然,如果没有更好的方法,/etc中的一些东西可能是可以接受的)。
我也尝试了PerlSetVar,但该值直到请求时间才可用。虽然这是可行的,但这意味着每个子线程init至少要从磁盘读取一次配置文件。我宁愿在服务器初始化时加载,并在创建子线程时拥有一个不可变的静态哈希,这是派生环境的一部分。
我考虑过使用config.pl,但这意味着我要么有一个config.pl,其中有一个选项来配置在哪里找到app.conf文件,要么我将选项本身移到config.pl中,并要求最终用户在设置选项时遵守Perl语法。未来的用户将是内部管理员,所以这不是不合理的,但它比我想要的更复杂。
我错过了什么?有什么好的选择吗?
通常最优先考虑的是避免在可执行文件中包含配置文件。否则,服务器配置错误可能会意外地向外界显示您的私有配置信息。我把应用程序所需的一切都放在/srv/app0
下,子目录cfg
是包含可执行文件的目录的兄弟目录。(更多细节。)
如果您通过PerlPostConfigRequire startup.pl
预加载模块以访问mod/startup.pl
,那么这是放置配置文件位置../cfg/app.cnf
的最佳位置,您可以完全灵活地将配置存储在内存中。另一种方法是PerlModule
模块,并在其中一个BEGIN
块中加载配置(使用如上所述的相对路径)。
处理配置文件通常不会花费太多时间,所以一个流行的选择是惰性加载:如果代码检测到配置缺失,它会在继续之前加载它。如果代码需要在此之前知道配置,那么这是没有用的,但是它避免了许多问题,特别是在将代码迁移到非modperl环境时。