Bir PHP App Ayarlarını depolamak için en iyi yolu?

7 Cevap php

Özel bir PHP uygulaması için küresel ayar grubunu depolamak için en iyi yaklaşım nedir? Ben kişisel bir proje (gerçekten ilk büyük bir) üzerinde çalışan, ve uygulama için genel ayarları kaydetmek için anahtar-değer çiftlerini saklamak için bir yöntem ihtiyaç duyuyorum.

Olarak saklamak Şeyler ...

  • Web sitemin Küresel adı.
  • Tema (sadece bir değişken veya tema yol)
  • vb

Ben sadece tek bir tabloda tutulması gerekir? Eğer öyleyse ne bir boostrap onları sorgulamak için en iyi yolu nedir? İstediğiniz her ayar için tek bir sorgu yapıyor yanı sıra.


UPDATE: Yes a .ini or parsing an include file would be nice, and I know how to do it that way. But I wanted to know what would be the best approach to storing them in MySQL with everything else.


UPDATE2: The reason I ask this also is I plan for a lot of these settings to be changeable through the Administrator interface. So if you were to change the Title of the site, it would be updated right away, which I figured would be best to do through SQL, thus needing setting inside the DB.

7 Cevap

Bir .php dosyasına koyarak ve bunları kullanmak için gereken sayfalarında bunu içeren düşündünüz mü? Değişkenleri benzersiz bir ad verin böylece adlandırma çatışmalarını önlemek.

Eğer PHP uygulamalarında tekrar tekrar bunları kullanarak olacak bu yana, bu en ideal olacaktır. Bu aynı zamanda bir veritabanında depolamak için sanki veritabanı aramaları yapmak için gereksinimini ortadan kaldırır.

AppSettings.php

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

UPDATE:

Ben bu ayarlar bir web sayfası üzerinden düzenlenebilir olması ve bu ayarlar değişecek beri multipl DB sorgular istemiyorum istediğinizi varsayalım, ama çok sık değil?

Ben şahsen aldı bir yaklaşım AppSettings'i tablo serialize ve bir XML dosyasında saklamak oldu. Tabii ki, tablo güncellenir, her zaman, masa reserialized ve XML dosyasında saklanır. Sonra XML dosyasını ayrıştırır ve gerekli özel değerleri döndüren ayrı bir sınıf yarattı.

Bir tek, küçük, basit bir site için, ben sadece bir PHP dosyası config koymak istiyorum. Basit tutun. PHP muhtemelen PHP ayrıştırmak daha hızlı bir şey ayrıştırmaz. APC kullanırsanız, derlenmiş baytkodu bile önbelleğe - baytkodu sonra her istek için yeniden idam olmasına rağmen. Küçük bir yapılandırma dosyası, bu bytekod yürütme çok az zaman gerekir; çok geniş bir dosya için, biraz uzun sürebilir.

(Tek bir dizi olarak örneğin) APC iyi bir fikir yapılandırma veri olduğunu önbelleğe büyük biçimlendirimleri, yüksek trafikli siteler için - en azından, sen aslında executing tabloların yükünü tasarruf edin config.php dosyası. Özellikle, facebook yapar. Eğer her istek üzerine (parse_ini_file, bir XML çözümleyici, vb kullanarak) bir yapılandırma dosyasını okumak için diski isabet saniyede birçok istekleri, hizmet olduğunuzda söz konusu değildir.

Benim geçerli proje için, biz pek çok site, kendi yapılandırma ile her ev sahipliği. Her site bir veritabanı ve bir config dosyası de vardı; Ancak, her zaman doğru veritabanı ile doğru yapılandırma dosyasını kullanarak konum emin bir baş ağrısı olabilir. Db ve config - Ayrıca, değişikliklerin iki yerde şeyleri değiştirmeyi gerektirir. Birini ya da diğer her kaynaklanan sorunları unutmadan, ve o kadar çok sık oldu.

Muhtemelen doğru yapılandırma Neler gelen bir db ayıramazsınız, ve herhangi bir kod değişiklikleri sadece veritabanı güncelleme gerektiren Biz, böylece veritabanına yapılandırma taşındı. Yapılandırma tablodaki veriler de agresif APC önbelleğe, bu yüzden nadiren bunu sorgulamak.

Yani, Özetle:

  1. Small site: Sadece bir config.php dosyası kullanmak
  2. Very large site: APC cache
  3. Multiple sites: yönetim yükü azaltmak için veri tabanında saklamak yapılandırma; veritabanı hit azaltmak için APC cache

Biz sadece kullanmak

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

Dahil bir php dosyası. Bir dizideki değerleri koyarak isim çatışmalar ile olur.

i büyük olasılıkla birden fazla yerde gerekli yapılandırmayı saklamak anlamına gelir ki, bir mysql tabloda şeyleri tutmak istiyorum anlıyorum. Örneğin, ben bir yerde bir dize saklanan veritabanı sunucusu ve adını isteyeceksiniz eminim. ki (nasıl bu şeyleri bilmeden veritabanına bağlanabilirsiniz) bir veritabanından onları okuyamaz beri ekleme veya. ini dosyası olanlar koyarak anlamına gelir. Eğer öyleyse, ekleme veya. ini dosyasında db bağlantı bilgisi ve veritabanı ayarları geri kalanı tutmak olurdu? çalıştığını, herhalde, ama (config.php veya application.ini ya da her neyse) bir dosyada tüm ayarları tutmak istiyorum. onu daha kolay imo korumak için yapar.

-Don

Sadece bu konuda IRC birkaç kişi ile sohbet bitti. Ben bir kopyasının SQL dökümü çekti sonra Wordpress bu nasıl ele baktı. Ben bu düzeni kullanmak ve sütunlar biraz adlandırmak düşünüyorum. Ama fikir ...

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

Ben genellikle benim index.php dosyasının içinde bu kadar "gerekli" ayarlarını:

<?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');
?>

ve benim yapılandırma dosyası içinde:

<?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));
?>

İyi bir yaklaşım veritabanı aracılığıyla, bir kez sayfa başına sık kullanılan ayarları almak olacaktır. Ayar sayfasından yüklü olup olmadığını denetleyen bir autoload bool alanını tutmak gibi bir şey. Diğer, daha az sıklıkla getirilen ayarları için, havadan onları getirebilir.

Yerine her sayfa için getiriliyor hepsini önbelleğe karar verirseniz, size ayarları yeniden yüklemek için komut bildirmek için bir yol düşünmek isteyebilirsiniz - ya da elle bunu yapmak için bunu söylemek gerekiyor, bu yüzden olmaz Bazı değiştirdikten sonra eski ayarları ile takılıyorum.