我有一个我在mod_perl 2中编写的Web应用程序。(它是一个自定义处理程序模块,而不是注册表或perlrun脚本。)我想在服务器初始化时设置几个配置选项,最好是从配置文件。我遇到的问题是我没有找到一个传递我的应用程序配置文件的文件名的好地方。
我首先尝试加载“./app.conf”,但当前目录不是模块的位置,因此它不可预测且容易出错。或者,我必须假设一些路径 - 相对或绝对。这是不灵活的,如果更改主机OS分发,则可能会出现问题。我不想对路径进行硬编码(但是,如果没有更好的方法,/ etc中的某些内容可能是可接受的。)
我也尝试了PerlSetVar,但是在请求时间之前该值不可用。虽然这是可行的,但这意味着我可能每个子(线程)init至少一次从磁盘读取一个配置文件。我宁愿在服务器init加载并且有一个不可变的静态哈希,它是创建子项时生成的环境的一部分。
我考虑使用config.pl,但这意味着我要么有一个config.pl,其中有一个选项可以配置app.conf文件的位置,或者我将选项本身移到config.pl中并要求最终用户设置选项时要尊重Perl语法。未来的用户将是内部管理员,所以这不是不合理的,但它比我想要的更复杂。
那我错过了什么?有什么好的选择吗?
答案 0 :(得分:0)
通常,首要任务是避免在可执行文件中包含配置文件。否则,服务器配置错误可能会意外地向全世界显示您的私有配置信息。我将应用程序需要的所有内容放在/srv/app0
下,子目录cfg
是包含可执行文件的dirs的兄弟。 (More detail.)
如果您通过PerlPostConfigRequire startup.pl
预先加载模块以访问mod/startup.pl
,那么这是放置配置文件位置../cfg/app.cnf
的最佳位置,您可以完全灵活地了解如何存储在内存中配置。另一种方法是PerlModule
您的模块,并在其中一个模块中的BEGIN
块中加载配置(使用上面的相对路径)。
通常处理配置文件并不需要花费大量时间,因此一个流行的选择是延迟加载:如果代码检测到配置丢失,则在继续之前加载它。如果代码需要先知道配置,那就没用了,但它避免了很多问题,特别是在将代码迁移到非modperl环境时。