我在我的php项目中进行设置的最新想法是将所有设置存储在配置PHP文件中,php文件将只返回一个这样的数组...
<?php
/**
* @Filename app-config.php
* @description Array to return to our config class
*/
return array(
'db_host' => 'localhost',
'db_name' => 'socialnetwork',
'db_user' => 'root',
'db_password' => '',
'site_path' => 'C:/webserver/htdocs/project/',
'site_url' => 'http://localhost/project/',
'image_path' => 'C:/webserver/htdocs/fproject/images/',
'image_url' => 'http://localhost/project/images/',
'site_name' => 'test site',
'admin_id' => 1,
'UTC_TIME' => gmdate('U', time()),
'ip' => $_SERVER['REMOTE_ADDR'],
'testtttt' => array(
'testtttt' => false
)
);
?>
请注意,实际的配置数组要大得多,其中还有更多项目...
然后我会有一个Config.class.php文件,它将加载我的数组文件并使用魔术方法__get($ key)。然后我可以自动加载我的配置类文件并访问任何类似的网站设置......
$config->ip;
$config->db_host;
$config->db_name;
$config->db_user;
所以我意识到这很好用并且非常灵活,在我的课堂上我可以把它读入一个PHP文件中,就像我现在正在做的那样,将INI文件读入数组,将XML文件读入数组,将JSON文件读入阵列。所以它对于未来的项目非常灵活,但是我更关注我现在正在进行的这个特定项目的性能,它将是一个像facebook / myspace这样的社交网站,我在这个项目之前有过一个项目,有一次我大约有10万用户的表现变得非常重要。所以我不是“微观优化”或“过早优化”我严格要求以性能为目标的最佳方式,它不需要灵活,因为我只需要在这个项目上。
所以有了这些信息,我总是读到人们试图尽可能地消除函数调用,说函数调用会导致更多的开销。所以我想从更有经验的人那里了解你对此的看法?我不熟悉在PHP中使用类和对象,因此调用$ config-&gt; db_user;像在这个getOption('db_user')中那样在程序中调用函数一样昂贵; ?我猜它是相同的,每次我调用它使用__get()方法的设置。
为了获得最佳表现,我应该采取不同的方式吗?就像只是将我的配置数组加载到引导程序文件中,并在我需要它时访问项目......
$config['db_host'];
$config['db_username'];
$config['db_password'];
$config['ip'];
请不要让我做一堆基准测试,请告诉我你的想法
答案 0 :(得分:4)
从我看过的测试结果来看,我认为Alix Axel的反应在四种方法的相对速度方面是正确的。使用直接方法是最快的,使用任何一种魔术方法通常都会变慢。
另外,在优化方面。您描述的系统中任何单个请求的最大性能损失可能是解析XML / INI / JSON,而不是通过您决定使用的任何语法来访问它。如果要解决此问题,请在解析后将加载的数据存储在APC中。这将伴随一个警告,您只想在其中存储静态数据,而不是像UTC日期那样的动态内容。
答案 1 :(得分:3)
首先,我不是使用返回数组的包含文件,而是使用.ini文件,然后使用PHP的parse_ini_file()
加载设置。
其次,在这种情况下你不应该担心函数调用。为什么?因为您可能拥有100,000个用户,但如果所有100,000个用户执行脚本并需要一些配置值,则100,000个函数调用将分布在100,000个脚本上,这与性能完全无关。
如果单个脚本执行(例如,执行100,000个脚本),则函数调用只是一个问题。
因此,选择最自然的实现方式。对象或数组都可以同样有效。实际上,一个对象的优势在于你可以做到:
$db = $config->database->hostname;
其中$config->database
可以隐式加载INI文件的数据库部分,并将创建另一个可以返回hostname
条目的配置对象。如果您想以这种方式细分配置文件。
答案 2 :(得分:1)
IMO这些是最快的方法(按顺序):
$config['db_user']
$config->db_user
$config->db_user
通过__get()
getOption('db_user')
通过__get()
另外,你已经问了很多questions about your config system,不是我想的,但我特别记得你曾问a question about whether you should use parse_ini_file()
or not。
为什么一遍又一遍地重复基本相同的问题?
我认为您将过早优化提升到一个全新的水平,您应该担心100,000个用户 iff 的性能,当您获得50,000个左右的用户时,不是现在。