лучший способ обновить congfig.php - PullRequest
1 голос
/ 07 августа 2010

У меня есть файл config.php для одного из моих сайтов, который содержит информацию, необходимую для запуска сайта.Это выглядит примерно так:

<?php

$site_name="The Site";
$base_url = "http://site.com";
$upload_path = "/images";

?>

Получить значения из этого легко, я просто использую require 'config.php';, но как я могу дать возможность добавить это из формы HTML?Значит, как я могу обновить значения?Один из способов, который я имею в виду, - это использование fopen и fsave, примерно так:

<?php
$filename = 'config.php';
$somecontent = "config here";


if (is_writable($filename)) {


    if (!$handle = fopen($filename, 'w')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // Write $somecontent to our opened file.
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($handle);

} else {
    echo "The file $filename is not writable";
}
?>

Но это стандартный способ сделать это?Это как все эти cms пишут свой конфигурационный файл?

Ответы [ 7 ]

4 голосов
/ 07 августа 2010
$cfg['sitename'] = $_POST['sitename'];

$file     = "config.php";
$contents = "<?php\r\n\$cfg=".var_export($cfg,1).";\r\n?>";

file_put_contents($file,$contents);
3 голосов
/ 07 августа 2010

Ну, мне не нравится идея переписывать PHP-скрипты (config.php).

Я думаю, что более удачное решение - это иметь файл config.ini (вы должны обеспечить доступ кфайл. Это можно сделать с помощью файла .htaccess или переместить файл из области действия document_root) и просто прочитать файл.

config.ini content:

 key1 = value
 key2 = value
 key3 = value
 key4 = value

Примечания:

  • config.ini будет немного медленнее, чем config.php, но для некритических сайтов все будет в порядке
  • config.ini должен быть все же лучшим вариантом, чем использование базы данных
  • В качестве преимущества config.ini я вижу тот факт, что никто не может добавить скрипт php в ваш config.php
  • PHP содержит функцию parse_ini_file для анализа файлов ini ( пример использования )
  • Вы можете разделить содержимое ini-файла на разделы и режимы:

[Production] mysql_server = value mysql_username = value ...</p> <p>[Development] mysql_server = value mysql_username = value ...

2 голосов
/ 07 августа 2010

Запись в файл .php не очень хорошая идея. Лучше хранить ваши настройки в базе данных, INI-файл или XML-файл. Использование этих «хранилищ» для конфигурации позволяет легко читать и писать.

Внимание: обратите внимание, что вы должны помещать файлы .ini, .xml из корневого каталога вашего документа, чтобы избежать доступа к ним из Интернета.

Кроме того, я советую вам проверить Zend Config http://framework.zend.com/manual/ru/zend.config.html, чтобы увидеть, как запись в config реализована в OOP MVC framework.

1 голос
/ 08 августа 2010

Я уже некоторое время использую шаблонное решение tszming, и оно отлично работает - при условии, что вы уже освоились со Smarty или другими системами шаблонов, в противном случае это может быть слишком много усилий только для сохранения вашей конфигурации.

Более простое решение - иметь все параметры конфигурации в массиве и хранить его в файле в формате JSON.В начале каждого скрипта вы file_get_contents() и json_decode() файл настроек в массив.В любое время, когда вы хотите сохранить текущие параметры, вы json_encode() массив параметров и записываете в файл настроек с помощью file_put_contents().Это позволяет PHP читать и записывать конфигурацию с минимальными усилиями, но вы все равно можете редактировать ее с помощью текстового редактора.

1 голос
/ 07 августа 2010

Вы можете использовать создание шаблона для config.php, используя шаблонизатор, например, Smarty

config.tpl

<?php
     // DB Settings
     $db_host = "{$db->host}";
     $db_user = "{$db->user}";
     $db_password = "{$db->password}";
     ...

И используйте Smarty для рендеринга config.php , захвата вывода и сохранения в реальном файле конфигурации.

<?php
      $smarty->assign('db', $db);
      $output = $smarty->fetch('config.tpl');
      // ...save the output into config.php

Преимущество использования этого подхода заключается в том, что вы можете разделить макет и содержимое файла конфигурации, например, Вы можете добавить дополнительные комментарии в конфигурационном файле или легко упорядочить порядок элемента.

Кроме того, используя этот подход, вы можете легко перейти к другим форматам, таким как INI или XML , как это было предложено другими.

0 голосов
/ 07 августа 2010

Мое предложение из личного опыта состояло бы в том, чтобы сохранить самые основные вещи в файле конфигурации (соединение с базой данных), а все остальное в таблице базы данных. Вы всегда должны избегать записи чего-либо на сервере, если только вам это не нужно, иначе вы столкнетесь с проблемами с правами доступа, проблемами безопасности и т. Д.

Когда ты хочешь распространять подобные сценарии, становится все важнее.

Остальное, очень похоже на приведенный выше ответ:

<?php
$config = "<?php\r\n";

$file     = "/path/to/config.php";

foreach ( $_POST [ 'config' ] as $config_label => $config_value ):
    $config .= "$$config_label = '{$config_value}'\r\n";
endforeach;

file_put_contents($file,$config);

Удачи.

0 голосов
/ 07 августа 2010

Я полагаю, что именно так панель администратора большинства CMS позволяет вам писать напрямую в файл конфигурации, но:

  • Прежде чем сделать это, вы должны быть абсолютно уверены, что отправитель аутентифицирован как администратор.
  • REGISTER_GLOBALS желательно также отключить, хотя это скорее общая проблема безопасности, чем что-то конкретно связанное с этим.
...