📄 config.php
字号:
// }}} // {{{ PEAR_Config([file], [defaults_file]) /** * Constructor. * * @param string (optional) file to read user-defined options from * @param string (optional) file to read system-wide defaults from * * @access public * * @see PEAR_Config::singleton */ function PEAR_Config($user_file = '', $system_file = '') { $this->PEAR(); $sl = DIRECTORY_SEPARATOR; if (empty($user_file)) { if (OS_WINDOWS) { $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini'; } else { $user_file = getenv('HOME') . $sl . '.pearrc'; } } if (empty($system_file)) { if (OS_WINDOWS) { $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini'; } else { $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.conf'; } } $this->layers = array_keys($this->configuration); $this->files['user'] = $user_file; $this->files['system'] = $system_file; if ($user_file && file_exists($user_file)) { $this->readConfigFile($user_file); } if ($system_file && file_exists($system_file)) { $this->mergeConfigFile($system_file, false, 'system'); } foreach ($this->configuration_info as $key => $info) { $this->configuration['default'][$key] = $info['default']; } //$GLOBALS['_PEAR_Config_instance'] = &$this; } // }}} // {{{ singleton([file], [defaults_file]) /** * Static singleton method. If you want to keep only one instance * of this class in use, this method will give you a reference to * the last created PEAR_Config object if one exists, or create a * new object. * * @param string (optional) file to read user-defined options from * @param string (optional) file to read system-wide defaults from * * @return object an existing or new PEAR_Config instance * * @access public * * @see PEAR_Config::PEAR_Config */ function &singleton($user_file = '', $system_file = '') { if (is_object($GLOBALS['_PEAR_Config_instance'])) { return $GLOBALS['_PEAR_Config_instance']; } $GLOBALS['_PEAR_Config_instance'] = &new PEAR_Config($user_file, $system_file); return $GLOBALS['_PEAR_Config_instance']; } // }}} // {{{ readConfigFile([file], [layer]) /** * Reads configuration data from a file. All existing values in * the config layer are discarded and replaced with data from the * file. * * @param string (optional) file to read from, if NULL or not * specified, the last-used file for the same layer (second param) * is used * * @param string (optional) config layer to insert data into * ('user' or 'system') * * @return bool TRUE on success or a PEAR error on failure * * @access public */ function readConfigFile($file = null, $layer = 'user') { if (empty($this->files[$layer])) { return $this->raiseError("unknown config file type `$layer'"); } if ($file === null) { $file = $this->files[$layer]; } $data = $this->_readConfigDataFrom($file); if (PEAR::isError($data)) { return $data; } $this->_decodeInput($data); $this->configuration[$layer] = $data; return true; } // }}} // {{{ mergeConfigFile(file, [override], [layer]) /** * Merges data into a config layer from a file. Does the same * thing as readConfigFile, except it does not replace all * existing values in the config layer. * * @param string file to read from * * @param bool (optional) whether to overwrite existing data * (default TRUE) * * @param string config layer to insert data into ('user' or * 'system') * * @return bool TRUE on success or a PEAR error on failure * * @access public. */ function mergeConfigFile($file, $override = true, $layer = 'user') { if (empty($this->files[$layer])) { return $this->raiseError("unknown config file type `$layer'"); } if ($file === null) { $file = $this->files[$layer]; } $data = $this->_readConfigDataFrom($file); if (PEAR::isError($data)) { return $data; } $this->_decodeInput($data); if ($override) { $this->configuration[$layer] = array_merge($this->configuration[$layer], $data); } else { $this->configuration[$layer] = array_merge($data, $this->configuration[$layer]); } return true; } // }}} // {{{ writeConfigFile([file], [layer]) /** * Writes data into a config layer from a file. * * @param string file to read from * * @param bool (optional) whether to overwrite existing data * (default TRUE) * * @param string config layer to insert data into ('user' or * 'system') * * @return bool TRUE on success or a PEAR error on failure * * @access public. */ function writeConfigFile($file = null, $layer = 'user', $data = null) { if ($layer == 'both' || $layer == 'all') { foreach ($this->files as $type => $file) { $err = $this->writeConfigFile($file, $type, $data); if (PEAR::isError($err)) { return $err; } } return true; } if (empty($this->files[$layer])) { return $this->raiseError("unknown config file type `$layer'"); } if ($file === null) { $file = $this->files[$layer]; } $data = ($data === null) ? $this->configuration[$layer] : $data; $this->_encodeOutput($data); $opt = array('-p', dirname($file)); if (!@System::mkDir($opt)) { return $this->raiseError("could not create directory: " . dirname($file)); } if (@is_file($file) && !@is_writeable($file)) { return $this->raiseError("no write access to $file!"); } $fp = @fopen($file, "w"); if (!$fp) { return $this->raiseError("PEAR_Config::writeConfigFile fopen('$file','w') failed"); } $contents = "#PEAR_Config 0.9\n" . serialize($data); if (!@fwrite($fp, $contents)) { return $this->raiseError("PEAR_Config::writeConfigFile: fwrite failed"); } return true; } // }}} // {{{ _readConfigDataFrom(file) /** * Reads configuration data from a file and returns the parsed data * in an array. * * @param string file to read from * * @return array configuration data or a PEAR error on failure * * @access private */ function _readConfigDataFrom($file) { $fp = @fopen($file, "r"); if (!$fp) { return $this->raiseError("PEAR_Config::readConfigFile fopen('$file','r') failed"); } $size = filesize($file); $rt = get_magic_quotes_runtime(); set_magic_quotes_runtime(0); $contents = fread($fp, $size); set_magic_quotes_runtime($rt); fclose($fp); $version = '0.1'; if (preg_match('/^#PEAR_Config\s+(\S+)\s+/si', $contents, $matches)) { $version = $matches[1]; $contents = substr($contents, strlen($matches[0])); } if (version_compare("$version", '1', '<')) { $data = unserialize($contents); if (!is_array($data)) { if (strlen(trim($contents)) > 0) { $error = "PEAR_Config: bad data in $file";// if (isset($this)) { return $this->raiseError($error);// } else {// return PEAR::raiseError($error); } else { $data = array(); } } // add parsing of newer formats here... } else { return $this->raiseError("$file: unknown version `$version'"); } return $data; } // }}} // {{{ getConfFile(layer) /** * Gets the file used for storing the config for a layer * * @param string $layer 'user' or 'system' */ function getConfFile($layer) { return $this->files[$layer]; } // }}} // {{{ _encodeOutput(&data) /** * Encodes/scrambles configuration data before writing to files. * Currently, 'password' values will be base64-encoded as to avoid * that people spot cleartext passwords by accident. * * @param array (reference) array to encode values in * * @return bool TRUE on success * * @access private */ function _encodeOutput(&$data) { foreach ($data as $key => $value) { if (!isset($this->configuration_info[$key])) { continue; } $type = $this->configuration_info[$key]['type']; switch ($type) { // we base64-encode passwords so they are at least // not shown in plain by accident case 'password': { $data[$key] = base64_encode($data[$key]); break; } case 'mask': { $data[$key] = octdec($data[$key]); break; } } } return true; } // }}} // {{{ _decodeInput(&data) /** * Decodes/unscrambles configuration data after reading from files. * * @param array (reference) array to encode values in * * @return bool TRUE on success * * @access private * * @see PEAR_Config::_encodeOutput */ function _decodeInput(&$data) { if (!is_array($data)) { return true; } foreach ($data as $key => $value) { if (!isset($this->configuration_info[$key])) { continue; } $type = $this->configuration_info[$key]['type']; switch ($type) { case 'password': { $data[$key] = base64_decode($data[$key]); break; } case 'mask': { $data[$key] = decoct($data[$key]); break; } } } return true; } // }}} // {{{ get(key, [layer]) /** * Returns a configuration value, prioritizing layers as per the * layers property. * * @param string config key * * @return mixed the config value, or NULL if not found * * @access public */ function get($key, $layer = null) { if ($layer === null) { foreach ($this->layers as $layer) { if (isset($this->configuration[$layer][$key])) { return $this->configuration[$layer][$key]; } } } elseif (isset($this->configuration[$layer][$key])) { return $this->configuration[$layer][$key]; } return null; } // }}} // {{{ set(key, value, [layer]) /** * Set a config value in a specific layer (defaults to 'user'). * Enforces the types defined in the configuration_info array. An * integer config variable will be cast to int, and a set config * variable will be validated against its legal values. * * @param string config key * * @param string config value * * @param string (optional) config layer * * @return bool TRUE on success, FALSE on failure * * @access public
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -