代码之家  ›  专栏  ›  技术社区  ›  JasonDavis

在PHP中加载设置的最佳性能?

  •  1
  • JasonDavis  · 技术社区  · 15 年前

    我最新的想法是在我正在构建的整个PHP项目中,将我的所有设置存储在一个config 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文件,它将加载我的数组文件并使用magic方法获取($key)。然后我可以自动加载我的配置类文件并访问任何类似的站点设置…

    $config->ip;
    $config->db_host;
    $config->db_name;
    $config->db_user;
    

    所以我意识到这很好,而且非常灵活,在我的类中,我可以像现在这样用数组在php文件中读取它,将in i文件读取到数组中,将xml文件读取到数组中,将json文件读取到数组中。所以对于未来的项目来说,它是非常灵活的,但是我更关心我现在正在做的这个特定项目的性能,它将是一个像facebook/myspace这样的社交网络站点,在这个项目之前我已经有过一个,一旦我获得了大约100000个用户的性能,它就变得非常重要。因此,我不是“微观优化”或“过早优化”,我强烈希望在考虑性能的情况下,以最佳方式进行优化,它不需要灵活,因为我只需要在这个项目上使用它。

    所以有了这些信息,我经常读到有人试图尽可能地消除函数调用 函数调用导致更多开销 . 所以我想从更有经验的人那里了解你对这件事的看法?我不熟悉在PHP中使用类和对象,所以调用$config->db_user;的成本是否与调用像getoption(“db_user”)这样的过程中的函数一样高?我猜每次调用一个设置时,它都是使用uu get()方法。

    为了达到最佳性能,我应该换一种方式吗?就像把我的配置数组加载到一个引导文件中,在我需要它们的时候访问它们,就像这样…

    $config['db_host'];
    $config['db_username'];
    $config['db_password'];
    $config['ip'];
    

    请把你的想法告诉我,不用我做一些基准测试

    3 回复  |  直到 15 年前
        1
  •  4
  •   sfrench    15 年前

    从我所看到的测试中,我相信Alix-Axel在上述四种方法的相对速度方面的反应是正确的。使用直接方法是最快的,而且使用任何一种魔法方法通常都比较慢。

    此外,在优化方面。在您描述的系统中,对任何单个请求的最大性能影响可能是对xml/ini/json的解析,而不是通过您决定使用的任何语法访问它。如果要修复此问题,请在分析后将加载的数据存储在APC中。这将附带一个警告,即您只希望在其中存储静态数据,而不希望存储像UTC日期这样的动态数据。

        2
  •  3
  •   cletus    15 年前

    首先,我不使用返回数组的包含文件,而是使用.ini文件,然后使用php parse_ini_file() 加载设置。

    其次,在这种情况下,您不应该担心函数调用。为什么?因为您可能有100000个用户,但是如果所有100000个用户都执行一个脚本并需要一些配置值,那么您的100000个函数调用将分布在100000个脚本上,这对于性能来说是完全不相关的。

    仅当单个脚本执行(例如,执行100000个脚本)时,函数调用才是一个问题。

    所以选择最自然的实现。一个对象或一个数组都同样有效。实际上,一个对象有一个优势,你可以做到:

    $db = $config->database->hostname;
    

    在哪里? $config->database 只能隐式加载ini文件的数据库部分,并将创建另一个配置对象,该对象可以返回 hostname 条目。如果您想这样分割配置文件。

        3
  •  1
  •   Community Mohan Dere    8 年前

    在我看来,这是最快的方法(按顺序):

    1. $config['db_user'].
    2. >$config->db_user directly
    3. $config->db_user via uuu get()
    4. getoption('db_user'). via \u get().

    另外,您已经询问了很多 关于配置系统的问题 ,我不介意,但我特别记得您询问了 a关于您是否应使用 parse_ini_file()的问题. or not

    为什么你一次又一次重复基本相同的问题?

    我认为您正在将过早优化提升到一个全新的水平,您应该担心100000个用户的性能 iff >strong>并且当您获得50000个用户时,不是现在。

    直接地

  • $config->数据库用户 通过 __get()
  • getOption('db_user') 通过 _获取()
  • 另外,你已经问了很多 有关配置系统的问题 我不介意,但我特别记得你问的 a question about whether you should use parse_ini_file() or not .

    你为什么一遍又一遍地重复那些基本相同的问题?

    我认为你过早的优化到了一个全新的水平,你应该担心10万用户的性能。 敌我识别 当你有大约50000个用户时,不是现在。