6

经过几年的 PHP 开发,我看到并听到了各种存储“全局范围数据”的方法(全局、常量、ini/XML/YML 文件、数据库、单例属性……)。

通过“全球范围数据”,我的意思是:

  • 全局应用程序/项目设置,例如
    • 数据库配置
    • SMTP、FTP参数
  • 数据库标识符(例如数据库中定义的特定语言或国家的主键值)
  • 全局运行时设置,例如
    • 启用日志记录/调试
    • 环境是 dev / test / prod
  • 等等

...一旦检索到就不应更改,并且需要在项目代码的任何部分轻松访问。

一些全局数据可能需要存储为关联数组(因此不能声明为常量)。
例如:每种语言的日期格式。顺便说一句,我看到了关于数组常量的另一个 SO 问题,但是没有比unserialize在需要数组常量值的任何地方使用更具可读性的东西吗?

我的主要问题是:您建议以什么方式正确存储(我的意思是干净、可读、可靠)全局范围数据,以及为什么(优点/缺点)?

谢谢。

4

4 回答 4

2

我认为,使用 INI 文件管理所有配置的最佳方式。

例如,我正在创建一个 configuration.ini 文件,该文件存储我所有的系统配置,如数据库信息、url 等......

host_name="localhost";
database_name="my_database";
database_user="root";

在阅读的时候,你只需要使用 php 默认函数在 php 中解析这个 ini 文件,

$configuration = parse_ini_file("path/to/configuration.ini");
于 2011-04-22T12:26:39.367 回答
2

您可以按照自己喜欢的方式存储设置。我偏爱 PHP 数组或 INI 文件。

一旦你有了它,编写一个全局可用的访问器类。如果需要,您可以将其设为单例,但并非真正需要。

此类将解析您的设置存储并创建内部数据结构。只要确保那里没有任何设置器,这样数据就不会被覆盖。看看 Zend 如何实现它的 Zend_Config 类。这就是我所说的:http: //framework.zend.com/manual/en/zend.config.html

确保您的访问器类在全球范围内可用,以便您可以随时访问设置。

于 2011-04-22T12:31:21.907 回答
2

您可以查看Zend_Config以获得最常见的 config 实现。

  • 数组(仅限 php,直接但分散且难以阅读)
  • ini(易于手动读写)
  • xml(冗长且难以处理但非常灵活)
  • json(非常容易阅读,如果你也想通过 js 直接访问它会很棒)
  • yaml(你基本上直接写一个序列化数组)

当然,数组似乎是最直接和最简单的解决方案,因为它是纯 PHP 并且不需要任何特殊的解析器或编写器。

另一方面,其他格式也有明显的优势。Zend_Config 文档写了一些关于 ini 文件的例子。

INI 格式专门用于提供具有配置数据键的层次结构和配置数据部分之间的继承的能力。通过使用点或句点字符(“.”)分隔键来支持配置数据层次结构。

使用常量不是一个好主意,因为:

  1. 您的应用程序不需要一直查看所有配置选项,并且
  2. 更重要的是,您不能嵌套常量,并且嵌套对于配置非常重要。
于 2011-04-22T13:05:03.937 回答
1

parse_ini_file

; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

; This is an array
[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

还将它添加到 INI 文件(文件中的第一行)有助于保持安全:

;<?php die("<br /><br /><br /><br /><br /><h3>404 Not Found</h3><br /><br />The requested resource could not be found."); ?>
;Secure INI file
于 2011-04-22T12:33:55.473 回答