存储PHP应用程序的最佳方式&x27;什么样的设置?

存储PHP应用程序的最佳方式&x27;什么样的设置?,php,mysql,Php,Mysql,为自定义PHP应用程序存储一组全局设置的最佳方法是什么?我正在从事一个个人项目(第一个主要项目),需要一种存储键值对的方法来记录应用程序的总体设置 要存储为 网站的全球名称 主题(只是一个变量或主题的路径) 等 我应该把它们放在一张桌子上吗?如果是这样,从boostrap查询它们的最佳方式是什么?除了对每个所需设置执行单个查询之外 更新: 是的,一个.ini或者解析一个include文件会很好,我知道怎么做。但我想知道,将它们与其他内容一起存储在MySQL中的最佳方法是什么 更新2: 我

为自定义PHP应用程序存储一组全局设置的最佳方法是什么?我正在从事一个个人项目(第一个主要项目),需要一种存储键值对的方法来记录应用程序的总体设置

要存储为

  • 网站的全球名称
  • 主题(只是一个变量或主题的路径)
我应该把它们放在一张桌子上吗?如果是这样,从boostrap查询它们的最佳方式是什么?除了对每个所需设置执行单个查询之外


更新: 是的,一个.ini或者解析一个include文件会很好,我知道怎么做。但我想知道,将它们与其他内容一起存储在MySQL中的最佳方法是什么


更新2:
我问这个问题的原因也是我计划通过管理员界面更改很多设置。因此,如果您要更改站点的标题,它将立即更新,我认为最好通过SQL进行更新,因此需要在数据库中进行设置。

您是否考虑过将它们放在
.php
文件中,并将其包含在需要使用它们的页面上?为变量指定一个唯一的名称,以避免命名冲突

因为您将在PHP应用程序中重复使用它们,所以这将是最理想的。如果要将数据库调用存储在数据库中,这也避免了进行数据库调用

AppSettings.php

<?php
$_SITENAME_ = 'MyWebsite';
$_THEME_ = 'Theme/Path';
?>

更新: 我假设您希望这些设置可以通过网页编辑,并且不希望有多个DB查询,因为这些设置会更改,但不会太频繁

我个人采取的一种方法是序列化AppSettings表并将其存储在
XML
文件中。当然,每次更新表时,表都会被重新序列化并存储在XML文件中。然后,我创建了一个单独的类来解析XML文件并返回所需的特定值

$siteConfig['db_name'] = 'database1';
$siteConfig['site_name'] = 'Stackoverflow';

在包含的php文件中。将值放入数组有助于解决名称冲突。

我知道您希望将内容保存在mysql表中,但是,这可能意味着将所需配置存储在多个位置。例如,我确信您希望数据库服务器和名称存储在字符串中的某个位置。这意味着将它们放在include或.ini文件中,因为您无法从数据库中读取它们(如何在不知道这些内容的情况下连接到数据库)。那么,您要将db连接信息保存在include或.ini文件中,并将其余设置保存在数据库中?我想这是可行的,但我喜欢将所有设置保存在一个文件中(config.php或application.ini或其他文件)。这使得维护imo更加容易


-don

对于一个单一的、小的、简单的站点,我只是将config放在一个PHP文件中。保持简单。PHP解析任何东西的速度可能都比不上它解析PHP的速度。如果使用APC,编译后的字节码甚至会被缓存——尽管字节码随后会针对每个请求重新执行。对于一个小的配置文件,这个字节码执行应该花费很少的时间;对于非常大的文件,可能需要更长的时间

对于具有大型配置的高流量站点,在APC中缓存配置数据(例如,作为单个数组)是一个好主意——至少可以节省实际执行config.php文件中语句的开销。值得注意的是,facebook做到了这一点。当您每秒处理许多请求时,不可能在每个请求上点击磁盘读取配置文件(使用parse_ini_file、XML解析器等)

对于我当前的项目,我们托管了许多站点,每个站点都有自己的配置。每个站点都有一个数据库和一个配置文件;但是,确保始终使用正确的配置文件和正确的数据库可能会让人头疼。此外,更改需要在两个地方进行更改—数据库和配置。忘记一个或另一个总是会引起问题,而且发生得太频繁了

我们将配置移到了数据库中,因此您不可能将db与其正确的配置分开,任何代码更改都只需要更新数据库。配置表中的数据也被主动缓存在APC中,因此我们很少查询它

因此,总结一下:

  • 小型站点:只需使用config.php文件即可
  • 非常大的站点:APC中的缓存
  • 多个站点:在数据库中存储配置以减少管理开销;在APC中缓存以减少数据库命中

  • 刚刚在IRC上和几个人聊完这件事。我查看了Wordpress在我调出一个SQL转储副本后是如何处理的。我想我会使用这个布局并重新命名一些列。但是这个想法是

    option_id | option_name | option_value | autoload
    int       | varchar     | longtext     | varchar
    (PRIMARY) | (UNIQUE)    |              |
    

    我通常在index.php文件中设置“必需”设置,以便:

    <?php
    session_start();
    ob_start();
    
    define('BASEPATH', $_SERVER['DOCUMENT_ROOT'].'/_setUp/siteSetup/');      // CHANGE TO THE PATH OF THE SITE.
    define('URIPATH', 'http://localhost/_setUp/siteSetup/');                // CHANGE TO THE URL OF THE SITE.
    define ('DEBUGGER', true);                                              // CHANGE TO FALSE TO HIDE DEBUG MESSAGES
    include(BASEPATH.'system/lib/config.lib.php');
    ?>
    
    
    
    在我的配置文件中:

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    // public
    
    /* 
    example:
        <img src="<?php echo IMG ?>my_image.jpg">
        http://localhost/public/images/
        <img src="http://localhost/public/images/my_image.jpg">
    */
    define('CSS', URIPATH.'public/css/');                   // DEFINE DIR: css
    define('IMG', URIPATH.'public/images/');                // DEFINE DIR: images   
    define('JS', URIPATH.'public/scripts/');                // DEFINE DIR: scripts
    
    // system
    define('INC', BASEPATH.'system/includes/');             // DEFINE DIR: includes
    define('LIB', BASEPATH.'system/lib/');                  // DEFINE DIR: lib
    define('SQL', BASEPATH.'system/sql/');                  // DEFINE DIR: sql
    
    if (DEBUGGER) {
        ini_set('log_errors',TRUE);
        ini_set("error_log", BASEPATH.'system/'."error_log.txt");
    }
    else {
        ini_set('log_errors',TRUE);
        ini_set("error_log", BASEPATH.'system/'."error_log.txt");
    }
    
    $db_info = array(
        'host' => 'localhost',
        'username' => 'root',
        'password' => 'root',
        'database' => 'my_db'
    );
    
    
    /*
    to use:
        $db_info = unserialize(DB_INFO);
        echo $db_info['host'];
        echo $db_info['username'];
        echo $db_info['password'];
        echo $db_info['database'];
    */
    define('DB_INFO', serialize($db_info));
    ?>
    

    一个不错的方法是通过数据库每页获取一次常用设置。类似于保留一个
    autoload
    bool字段,用于检查设置是否应与页面一起加载。对于其他不太常见的获取设置,您可以通过无线方式获取它们


    如果您决定将它们全部缓存,而不是对每个页面进行抓取,那么您可能需要考虑一种方法来通知脚本重新加载设置——或者您必须手动告诉它这样做,因此,在更改一些设置后,您不会被旧设置所困扰。

    我喜欢Microsoft.Net的
    web.config
    ConfigurationManager.appSettings
    以及它的工作原理。所以我模仿了它,让它变得更好。它

    • 可以在任何环境下工作,无需交换文件(我总是忘记这一点,尤其是在周五下午4:59部署时。)
    • 是否自行记录函数调用的内容
    • 可以使用
      *
    
    
    用法

    $conn = new mysqli(Configuration::Setting('dbserver'), Configuration::Setting('dbuser'), Configuration::Setting('dbpassword'), Configuration::Setting('database'));
    
    <?php
    return [
        'database' => [
            'host' => 'localhost',
            'port' => 3006,
            'user' => 'username',
            'password' => // your secret password
        ],
        'application' => [
            'name' => 'Your site\'s name',
            'version' => '1.0-dev'
        ]
    ]
    
    $config = include('./config/settings.php');