programing

PHP에서 구성 파일 만들기

bestcode 2022. 12. 7. 22:29
반응형

PHP에서 구성 파일 만들기

PHP 프로젝트를 위한 구성 파일을 만들고 싶은데, 어떻게 하는 것이 가장 좋은지 잘 모르겠습니다.

저는 지금까지 3가지 아이디어가 있어요.

1-변수 사용

$config['hostname'] = "localhost";
$config['dbuser'] = "dbuser";
$config['dbpassword'] = "dbpassword";
$config['dbname'] = "dbname";
$config['sitetitle'] = "sitetitle";

2-사용 조건

define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
define('TITLE', 'sitetitle');

3-데이터베이스 사용

수업시간에 설정을 사용하기 때문에 어떤 방법이 최선인지, 더 나은 방법이 있는지 잘 모르겠습니다.

중 는 '우리'를 만드는 것입니다.config.php어레이를 반환하는 파일(또는 그 이름을 불문):

<?php

return array(
    'host' => 'localhost',
    'username' => 'root',
);

그 후:

$configs = include('config.php');

INI 파일을 사용하는 것은 유연하고 강력한 솔루션입니다.PHP에는 적절하게 처리할 수 있는 네이티브 함수가 있습니다.예를 들어 다음과 같은 INI 파일을 작성할 수 있습니다.

app.ini

[database]
db_name     = mydatabase
db_user     = myuser
db_password = mypassword

[application]
app_email = mailer@myapp.com
app_url   = myapp.com

전화만 하면 됩니다.

$ini = parse_ini_file('app.ini');

이렇게 하면 '어느 때, 어느 때, 어느 때, 어느 때'를 그 할 수 있습니다.$inimanager.manager로 하다

echo $ini['db_name'];     // mydatabase
echo $ini['db_user'];     // myuser
echo $ini['db_password']; // mypassword
echo $ini['app_email'];   // mailer@myapp.com

중요: 보안을 위해 INI 파일은 공용 폴더가 아닌 폴더에 있어야 합니다.

저는 @hugo_leonardo의 솔루션을 약간 진화시켰습니다.

<?php

return (object) array(
    'host' => 'localhost',
    'username' => 'root',
    'pass' => 'password',
    'database' => 'db'
);

?>

이를 통해 php를 포함할 때 오브젝트 구문을 사용할 수 있습니다.$configs->host$configs['host'].

등)에는, 이 「Angular 」(각도)를 사용할 수 있습니다.config.php파일에는 모든 설정이 포함되어 있습니다(하나의 JavaScript용 파일과 PHP용 파일이 아닌 하나의 파일에 집중되어 있습니다). 후, PHP 파일을 「PHP」라고 하는 또 것이 중요합니다.echo it say 」(콜: 「 it say 」(콜: 「Call it say 」()get_app_info.php:

<?php

    $configs = include('config.php');
    echo json_encode($configs->app_info);

?>

는, 「아주 좋다」라고 가정은 다음과 같습니다.config.php에는 를 contains contains an an가 되어 있습니다.app_info★★★★★★★★★★★★★★★★★★:

<?php

return (object) array(
    'host' => 'localhost',
    'username' => 'root',
    'pass' => 'password',
    'database' => 'db',
    'app_info' => array(
        'appName'=>"App Name",
        'appURL'=> "http://yourURL/#/"
    )
);

?>

앱 수 . 예를 "JavaScript"와 같이 할 수 있습니다. ★★★★★★★★★★★★★★★★★,$http.get('get_app_info.php').then(...);콜 타입

상대적인 장점과 단점을 가진 옵션은 다음과 같습니다.

파일 기반 메커니즘

이를 위해서는 코드를 특정 위치에서 검색하여 ini 파일을 찾아야 합니다.이것은 해결하기 어려운 문제이며, 큰 PHP 어플리케이션에서 항상 볼 수 있는 문제입니다.그러나 실행 시 통합/재사용되는 PHP 코드를 찾기 위해서는 문제를 해결해야 합니다.

이것에 대한 일반적인 접근법은 항상 상대 디렉토리를 사용하거나 현재 디렉토리에서부터 검색하여 응용 프로그램의 기본 디렉토리에서만 이름이 지정된 파일을 찾는 것입니다.

구성 파일에 사용되는 일반적인 파일 형식은 PHP 코드, ini 형식 파일, JSON, XML, YAML 및 직렬화된 PHP입니다.

PHP 코드

이를 통해 다양한 데이터 구조를 표현할 수 있는 엄청난 유연성이 제공되며 (포함 또는 요구를 통해 처리된다고 가정하면) opcode 캐시에서 구문 분석된 코드를 사용할 수 있으므로 성능상의 이점을 얻을 수 있습니다.

include_path는 추가 코드에 의존하지 않고 파일의 잠재적인 위치를 추상화하는 수단을 제공합니다.

한편 Configuration과 코드를 분리하는 주요 이유 중 하나는 책임을 분리하는 것입니다.런타임에 추가 코드를 삽입하기 위한 경로를 제공합니다.

툴에서 구성을 작성하면 툴의 데이터를 검증할 수 있지만 HTML, URL, MySQL 문, 셸 명령어 등 PHP 코드에 데이터를 삽입하기 위한 표준 함수는 없습니다.

Serialized data 이것은 소량의 구성(최대 200개 항목)에 대해 비교적 효율적이며 모든 PHP 데이터 구조를 사용할 수 있습니다.데이터 파일을 작성/파싱하는 데 필요한 코드는 거의 없습니다(그 대신 적절한 인증으로만 파일을 작성할 수 있도록 하는 데 노력을 들일 수 있습니다).

파일에 기입된 컨텐츠의 이스케이프는 자동적으로 처리됩니다.

오브젝트를 시리얼화할 수 있기 때문에 컨피규레이션파일(__wakeup 매직메서드)을 읽는 것만으로 코드를 호출할 기회가 생깁니다.

구조화 파일

Marcel, JSON 또는 XML이 제안한 INI 파일로 저장하면 시리얼화된 PHP 데이터를 사용하여 코드 호출 취약성을 제거하면서 파일을 PHP 데이터 구조에 매핑할 수 있는 간단한 api도 제공됩니다(XML은 예외로 하고 데이터를 이스케이프하여 파일을 만듭니다.

시리얼화된 데이터와 유사한 성능 특성을 가집니다.

데이터베이스 스토리지

이 점은 매우 많은 양의 구성을 가지고 있지만 현재 작업에 필요한 것을 선택할 때 가장 적합합니다. 약 150개의 데이터 항목에서 로컬 MySQL 인스턴스에서 데이터를 가져오는 것이 데이터 파일의 시리얼화를 해제하는 것보다 더 빠르다는 것을 알고 놀랐습니다.

OTOH는 데이터베이스 연결에 사용하는 자격 증명을 저장하는 데 적합하지 않습니다.

실행 환경

PHP가 실행되고 있는 실행 환경에서 값을 설정할 수 있습니다.

이것에 의해, PHP 코드가 설정의 특정의 장소를 검색할 필요가 없어집니다.OTOH는 대량의 데이터로 확장성이 뛰어나지 않고 런타임에 전체적으로 변경하기 어렵습니다.

클라이언트 상

구성 데이터 저장에 대해 언급하지 않은 곳이 클라이언트입니다.네트워크 오버헤드는 대량의 구성으로 확장되지 않음을 의미합니다.또한 최종 사용자가 데이터를 제어할 수 있기 때문에 조작을 검출할 수 있는 형식(암호 서명이 있는 형식)으로 저장해야 하며 공개에 의해 침해되는 정보(가역적으로 암호화됨)를 포함할 수 없습니다.

이와 반대로 최종 사용자가 소유한 기밀 정보를 저장하는 데는 많은 이점이 있습니다.서버에 저장하지 않으면 도난당할 수 없습니다.

네트워크 디렉토리 구성 정보를 저장하는 또 다른 중요한 장소는 DNS/LDAP입니다.이 방법은 소수의 정보에 유효합니다.단, 첫 번째 일반 형식을 고수할 필요는 없습니다.를 들어 SPF를 고려해 주십시오.

이 인프라스트럭처는 캐싱, 복제 및 배포를 지원합니다.따라서 매우 큰 인프라스트럭처에 적합합니다.

버전 관리 시스템

코드와 같은 구성을 관리하고 버전을 관리해야 합니다.따라서 VC 시스템에서 직접 구성을 가져오는 것이 실행 가능한 솔루션입니다.그러나 많은 경우 상당한 성능 오버헤드를 수반하므로 캐싱을 권장합니다.

데이터베이스 구성 데이터를 데이터베이스에 저장하는 것은 좀 어려울 것 같습니다.그렇지 않습니까?

하지만 어떤 스타일이든 정말 잘 어울리고 모든 것이 선호도에 따라 달라지기 때문에 이것은 매우 독단적인 질문입니다.개인적으로, 저는 상수보다는 구성 변수를 선호합니다. 일반적으로 저는 필요한 경우를 제외하고는 글로벌 공간에 있는 것들을 좋아하지 않기 때문입니다.코드베이스에 있는 함수 중 데이터베이스 패스워드에 쉽게 접근할 수 있는 함수는 없습니다(데이터베이스 접속 로직 제외).그래서 거기서 패스워드를 사용한 후 파기합니다.

편집: 코멘트에 응답해 주세요.파싱 메커니즘이 가장 빠르지 않습니다(ini, json 등).그러나, 그러한 작은 파일에서는, 속도의 차이는 무시할 수 있기 때문에, 이러한 메커니즘은 애플리케이션의 최적화에 집중할 필요가 없습니다.

config class witch static 속성을 생성할 수 있습니다.

class Config 
{
    static $dbHost = 'localhost';
    static $dbUsername = 'user';
    static $dbPassword  = 'pass';
}

간단하게 사용할 수 있습니다.

Config::$dbHost  

프로젝트에서는 설계 패턴 SINGLETON을 사용하여 설정 데이터에 액세스 할 수 있습니다.사용감이 매우 좋습니다.

왜요?

예를 들어 프로젝트에 데이터 소스가 두 개 있다고 가정합니다.그 중 마녀가 유효하게 되어 있는 것을 선택할 수 있습니다.

  • mysql
  • json

config 파일 중 하나를 선택합니다.

$dataSource = 'mysql' // or 'json'

소스 전체 앱을 새로운 데이터 소스로 변경할 경우 정상적으로 작동하며 코드를 변경할 필요가 없습니다.

예:

설정:

class Config 
{
  // ....
  static $dataSource = 'mysql';
  / .....
}

싱글톤 클래스:

class AppConfig
{
    private static $instance;
    private $dataSource;

    private function __construct()
    {
        $this->init();
    }

    private function init()
    {
        switch (Config::$dataSource)
        {
            case 'mysql':
                $this->dataSource = new StorageMysql();
                break;
            case 'json':
                $this->dataSource = new StorageJson();
                break;
            default:
                $this->dataSource = new StorageMysql();
        }
    }

    public static function getInstance()
    {
        if (empty(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getDataSource()
    {
        return $this->dataSource;
    }
}

...코드의 어딘가에서 (일부 서비스 클래스 등) :

$container->getItemsLoader(AppConfig::getInstance()->getDataSource()) // getItemsLoader need Object of specific data source class by dependency injection

AppConfig 오브젝트는 시스템 내 임의의 장소에서 취득할 수 있으며 항상 동일한 복사본을 얻을 수 있습니다(스태틱 덕분에).클래스의 init() 메서드는 In constructor라고 불리며, 1개의 실행만 보증합니다.Init() 본문은 설정 $dataSource 값을 체크하고 특정 데이터 소스 클래스의 새 개체를 만듭니다.이제 스크립트는 실제로 어떤 구현이 존재하는지조차 파악하지 못한 상태에서 객체를 가져와 조작할 수 있습니다.

Define은 글로벌을 사용할 필요 없이 클래스 내 어디에서나 상수를 사용할 수 있도록 합니다.한편 DEFINE을 사용합니다.하지만 프로그램 실행 중에 db 파라미터가 변경되면 변수를 계속 사용할 수 있습니다.

어떤 이유로든 두 개 이상의 db를 사용할 것으로 생각되면 변수를 사용하십시오. 왜냐하면 하나의 파라미터를 변경하여 완전히 다른 db로 전환할 수 있기 때문입니다.테스트, 자동 백업 등

이게 내 방식이야.

    <?php

    define('DEBUG',0);

    define('PRODUCTION',1);



    #development_mode : DEBUG / PRODUCTION

    $development_mode = PRODUCTION;



    #Website root path for links

    $app_path = 'http://192.168.0.234/dealer/';



    #User interface files path

    $ui_path = 'ui/';

    #Image gallery path

    $gallery_path = 'ui/gallery/';


    $mysqlserver = "localhost";
    $mysqluser = "root";
    $mysqlpass = "";
    $mysqldb = "dealer_plus";

   ?>

의문 사항이 있으면 코멘트해 주십시오.

보통 데이터베이스 접속이 있는 conn.php 파일을 1개 작성하게 됩니다.데이터베이스 조회가 필요한 모든 파일에 해당 파일을 포함시킵니다.

이런 건 어때?

class Configuration
{

    private $config;

    
    public function __construct($configIniFilePath)
    {
        $this->config = parse_ini_file($configIniFilePath, true);
    }

    /**
     * Gets the value for the specified setting name.
     *
     * @param string $name the setting name
     * @param string $section optional, the name of the section containing the
     *     setting
     * @return string|null the value of the setting, or null if it doesn't exist
     */
    public function getConfiguration($name, $section = null)
    {
        $configValue = null;

        if ($section === null) {
            if (array_key_exists($name, $this->config)) {
                $configValue = $this->config[$name];
            }
        } else {
            if (array_key_exists($section, $this->config)) {
                $sectionSettings = $this->config[$section];
                if (array_key_exists($name, $sectionSettings)) {
                    $configValue = $sectionSettings[$name];
                }
            }
        }

        return $configValue;
    }
}

config.conf 와 같은 설정 파일이 있는 경우(http://example.com/config.conf) 이 됩니다).

user=cacom
version = 2021608
status= true

내 기능은 다음과 같습니다.

function readFileConfig($UrlOrFilePath){

    $lines = file($UrlOrFilePath);
    $config = array();
    
    foreach ($lines as $l) {
        preg_match("/^(?P<key>.*)=(\s+)?(?P<value>.*)/", $l, $matches);
        if (isset($matches['key'])) {
            $config[trim($matches['key'])] = trim($matches['value']);
        }
    }

    return $config;
}

다음을 사용할 수 있습니다.

$urlRemote = 'http://example.com/default-config.conf';
$localConfigFile = "/home/domain/public_html/config.conf";
$localConfigFile2 = "config.conf";

print_r(readFileConfig($localConfigFile2));
print_r(readFileConfig($localConfigFile));
print_r(readFileConfig($urlRemote));

다음의 간단한 것을 사용할 수 있습니다.

define('someprop', 0);

그리고.

echo someprop; 0// 출력 0// 출력 0

여기 있어요.

<?php
$server = "localhost";
$username = "root";
$password = "";
$db = "your_db_name";


$conn = mysqli_connect($server, $username, $password, $db);

if(!$conn){
   die('Error in connecting to server or Database');
 }
?>

언급URL : https://stackoverflow.com/questions/14752470/creating-a-config-file-in-php

반응형