PHP - файл конфигурации Приложения, сохраненный как - ini, php, sql, кэшируемый, php класс, JSON, php массив?

Я думаю, что это нелегко векторизовать .... по крайней мере, я не знаю, как это сделать.

Вы можете сделать это by hand через:

my_cumsum <- function(x){
  grp = integer(length(x))
  grp[1] = 1
  for(i in 2:length(x)){
    if(x[i-1] + x[i] <= 10){
      grp[i] = grp[i-1]
      x[i] = x[i-1] + x[i]
    } else {
      grp[i] = grp[i-1] + 1
    }
  }
  data.frame(grp, x)
}

Для вашего данные дают:

> my_cumsum(df$value)
   grp  x
1    1  4
2    1  9
3    2  7
4    2 10
5    3  8
6    3  9
7    4  2
8    4  7
9    4 10
10   5  6
11   5  8
12   6  6
13   6  9
14   6 10
15   7  4

Также для моего «встречного примера» это дает:

> my_cumsum(c(10,6,4))
  grp  x
1   1 10
2   2  6
3   2 10

Как заметил @Khashaa, это можно реализовать более эффективно с помощью Rcpp , Он связан с этим ответом Как ускорить или векторизовать цикл for? , который я нахожу очень полезным

24
задан Mark 27 November 2009 в 15:00
поделиться

10 ответов

Лучшее, что вы можете сделать, это простейшая вещь, которая могла бы работать (переменные php) и заключить ее в класс. Таким образом, вы можете изменить реализацию позже, не меняя клиентский код. Создайте интерфейс, который реализует класс конфигурации, и заставьте клиентский код использовать методы интерфейса. Если позже вы решите сохранить конфигурацию в базе данных, JSON или чем-то еще, вы можете просто заменить существующую реализацию на новую. Убедитесь, что ваш класс конфигурации доступен для тестирования, и напишите модульные тесты.

8
ответ дан 28 November 2019 в 23:30
поделиться

Мы используем файл с именем Local.php, который исключен из системы SCM. Он содержит несколько констант или глобальных переменных. Например:

// Local.php
class Setting
{
   const URL = 'http://www.foo.com';
   const DB_User = 'websmith';
}

И его можно сослаться на в любом месте просто:

Setting::URL

. вместо этого вы используете открытые статические переменные.

13
ответ дан gahooa 28 November 2019 в 23:30
поделиться

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

В любом случае, сохранение этих данных в JSON, INI, XL и т. Д. - это просто еще одна ненужная абстракция, которая слишком много делается в настоящее время в Интернете. Ваш лучший выбор - чистый PHP, если вам не нравится гибкость некоторых настроек в базе данных.

0
ответ дан monokrome 28 November 2019 в 23:30
поделиться

Мне нравится идея иметь «пространства имен» или какое-то дерево

, поэтому вы можете иметь:

db.default.user

или

db.readonly.user

и т. Д. .

Теперь о коде. То, что я сделал, было интерфейсом для считывателей конфигурации: так что вы можете иметь считыватель памяти, считыватель массива, читатель БД и т. Д.

и класс конфигурации, который использует эти считыватели и позволяет вам иметь конфигурацию из любого источника

0
ответ дан Gabriel Sosa 28 November 2019 в 23:30
поделиться

Попробуйте использовать файлы конфигурации php-массивов, используя метод, описанный здесь: http://www.dasprids.de/blog/2009/05/08/writing-powerful-and-easy-config-files-with-php-arrays

Этот метод позволяет вам напишите конфигурацию приложения таким образом: app.config.php

<?php

return array(
  'appname' => 'My Application Name',
  'database' => array(
    'type' => 'mysql',
    'host' => 'localhost',
    'user' => 'root',
    'pass' => 'none',
    'db' => 'mydb',
  ),
);

Этот метод безопасен, его можно кэшировать с помощью кешеров опкодов (APC, XCACHE).

8
ответ дан 28 November 2019 в 23:30
поделиться

Я считаю Zend_Config хорошим решением. Вы можете загрузить конфигурацию из простого массива , из файла стилей INI или из XML-документа . Что бы вы ни выбрали, объект конфигурации остается тем же, поэтому вы можете свободно переключать форматы хранения. Объекты Zend_Config также могут быть объединены, в зависимости от вашего приложения это может быть полезно (конфигурация сервера, затем конфигурация для каждого сайта / установки).

Как и большинство (или все) вещей в Zend Framework , вы можете легко использовать Zend_Config отдельно.

Учитывая эффективность , я бы сказал, что самым быстрым методом было бы использование массива, поскольку для этого требуется меньше (в данном случае нет) синтаксического анализа строк . Однако некоторым может быть проще поддерживать формат INI / XML. Конечно, некоторое кэширование даст вам лучшее из обоих миров.

Кроме того, использование INI-файлов с Zend_Config позволяет вам определять разделы конфигураций, которые наследуются друг от друга. Чаще всего используется раздел «разработка», который наследуется от раздела «производство», а затем переопределяет параметры базы данных / отладки.

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

Чаще всего используется раздел «разработка», который наследуется от раздела «производство», а затем переопределяет параметры базы данных / отладки.

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

Чаще всего используется раздел «разработка», который наследуется от раздела «производство», а затем переопределяет параметры базы данных / отладки.

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

5
ответ дан 28 November 2019 в 23:30
поделиться

Просто пример того, как реализовать центральную конфигурацию XML / Xpath.

class Config {
    private static $_singleton;
    private $xml;
    static function getInstance() {
        if(is_null (self::$_singleton) ) {
                self::$_singleton = new self;
        }
        return self::$_singleton;
    } 
    function open($xml_file) {
        $this->xml = simplexml_load_file($xml_file);
        return $this;
    }
    public function getConfig($path=null) {
        if (!is_object($this->xml)) {
            return false;
        }
        if (!$path) {
            return $this->xml;
        }
        $xml = $this->xml->xpath($path);
        if (is_array($xml)) {
            if (count($xml) == 1) {
                return (string)$xml[0];
            }
            if (count($xml) == 0) {
                return false;
            }
        }
        return $xml;
    }
}

Пример вызова

Config::getInstance()
    ->open('settings.xml')
    ->getConfig('/settings/module/section/item');
2
ответ дан 28 November 2019 в 23:30
поделиться

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

Если такие вещи вызывают беспокойство, тогда вы может написать специальную страницу администратора в вашем приложении (предпочтительно локальный доступ только для безопасности), которая временно блокирует систему, а затем считывает и развертывает все ваши изменения перед разблокировкой.

Если у вас сайт с высоким трафиком, где важна согласованность, вам стоит подумать об этом. Если вы можете развернуть в нерабочее время, когда мало / нет трафика,

0
ответ дан 28 November 2019 в 23:30
поделиться

Как насчет:

; <?php die('Direct access not allowed ;') ?>
; The above is for security, do not remove

[database]
name = testing
host = localhost
user = root
pass = 

[soap]
enableCache = 1
cacheTtl = 30

Сохраните как config.php (или что-то в этом роде, должно иметь расширение php), а затем просто загрузите его с помощью:

parse_ini_file('config.php', true);

И вы можете использовать

array_merge_recursive(parse_ini_file('config-default.php', true), parse_ini_file('config.php', true))

чтобы объединить файл конфигурации по умолчанию с более конкретным файлом конфигурации.

Дело в том, что вы можете использовать очень читаемый формат ini, но при этом иметь возможность иметь файл конфигурации в общедоступном каталоге. Когда вы откроете файл в браузере, php сначала проанализирует его и выдаст результат, который будет просто «; Прямой доступ запрещен;». Когда вы анализируете файл непосредственно как ini-файл, оператор php die будет закомментирован в соответствии с синтаксисом ini (;), поэтому он не будет иметь никакого эффекта.

5
ответ дан 28 November 2019 в 23:30
поделиться

На мой взгляд, хорошим решением будут ini-файлы.

Я не предпочитаю конфигурационный файл, использующий массивы / переменные для хранения настроек; вот почему:

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

Мне нравится использовать ini-файл для настройки моих приложений php. Вот почему:

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

Примечание: вам необходимо использовать функцию parse_ini_file для чтения файлов ini.

2
ответ дан 28 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: