Просмотр файла system/inc/classes/ini.class.php

Размер файла: 9.74Kb
<?php
/* 
 * Поиск файлов INI уточняется.
 */ 
function search_ini_file ( $filename, $search_param, $return_section = false ) 
 { 
         $search_key =   (isset($search_param['key'])?$search_param['key']:false); 
         $search_value = (isset($search_param['value'])?$search_param['value']:false); 
         if ( !($search_key !==false || $search_value !==false) ){ 
                 return false; 
         } 
         $retvalue = false; 
         $handle = fopen($filename, 'r'); 
         if ( ($search_key !== false) && ($search_value !== false) ){ 
                 $key_found = false; 
                 $retvalue['key'] = false; 
                 $retvalue['value'] = false; 
                 while( !feof($handle) ) { 
                         $line = trim(fgets($handle, 4096)); 
                         if (preg_match("/^\[$search_key\].*?$/s",$line)){ 
                                 $key_found = true; 
                                 $retvalue['key'] = true; 
                                 continue; 
                         } 
                         if ($key_found){ 
                                 if (preg_match("/^\[.*?$/", trim($line))){ 
                                         break; 
                                 }else{ 
                                         if ($return_section){ 
                                                 if ($line != '') { 
                                                         list($k, $v) = split("=", $line); 
                                                         $retvalue[$search_key][$k] = preg_replace("/;.*$/", "", $v); 
                                                 }   }   } 

                                 if (preg_match("/^$search_value\s*?=.*$/", $line)){ 
                                         $retvalue['value'] = true; 
                                         break; 
                                 }   }  } 
         }elseif ($search_key !== false){ 
                 $keyfound = false; 
                 while ( !feof($handle) ){ 
                         $line = trim(fgets($handle, 4096)); 
                         if (preg_match("/^\[$search_key\].*?$/s",$line)){ 
                                 $retvalue  = true; 
                                 if (!$return_section){ 
                                         break; 
                                 }else{ 
                                         $retvalue = Array(); 
                                         $keyfound = true; 
                                         continue; 
                                 }  } 

                         if ( $keyfound ){ 
                                 if (preg_match("/^\[.*?$/", trim($line))){ 
                                         break; 
                                 }else{ 
                                         if ($return_section){ 
                                                 if ($line != ''){ 
                                                         list($k, $v) = split("=", $line); 
                                                         $retvalue[$search_key][$k] = preg_replace("/;.*$/", "", $v); 
                                                 }   }  }  }  } 
         }elseif ($search_value !== false){ 
                 while ( !feof($handle) ){ 
                         $line = trim(fgets($handle, 4096)); 

                         if (preg_match("/^$search_value\s*?=.*$/", $line)){ 
                                 $retvalue = true; 
                                 if ($return_section){ 
                                         $retvalue = array(); 
                                         if ($line != ''){ 
                                                 list($k, $v) = split("=", $line); 
                                                 $retvalue[$k] = preg_replace("/;.*$/", "", $v); 
                                         }  } 
                                 break; 
                         }   }  } 
         fclose($handle); 
         return $retvalue; 
 }
abstract class ini {
    static function value_encode($str) {
        $str = str_replace(array("\r", "\n", "\t"), array('\r', '\n', '\t'), $str);
        return htmlentities($str, ENT_QUOTES, 'UTF-8');
    }
    static function value_decode($str) {
        $str = str_replace(array('\r', '\n', '\t'), array("\r", "\n", "\t"), $str);
        return html_entity_decode($str, ENT_QUOTES, 'UTF-8');
    }
    static function openString($string, $sect = false) {
        $tmp_file = TMP . '/' . passgen() . '.tmp';
        if (!@file_put_contents($tmp_file, $string)) {
            return false;
        }
        $ini = self::read($tmp_file, $sect);
        unlink($tmp_file);
        return $ini;
    }
    static function read($file, $sect = false) {
        $arr = @parse_ini_file($file, $sect);
        if ($arr) {
            if ($sect) {
                foreach ($arr as $key => $value) {
                    foreach ($value as $key2 => $value2) {
                        $arr [$key] [$key2] = self::value_decode($value2);
                    }
                }
            } else {
                foreach ($arr as $key => $value) {
                    $arr [$key] = self::value_decode($value);
                }
            }
        }
        return $arr;
    }
    static function save($file, $array, $sect = false) {
        $tmp_file = TMP . '/tmp.' . passgen() . '.ini';
        $ini = array();
        $ini[] = "; SHCMS_ENGINE ini_class";
        if ($sect) {
            foreach ($array as $key => $value) {
                $ini [] = '[' . self::value_encode($key) . ']';
                foreach ($value as $key2 => $value2) {
                    $ini [] = "$key2 = \"" . self::value_encode($value2) . "\";";
                }
            }
        } else {
            foreach ($array as $key => $value) {
                $ini [] = "$key = \"" . self::value_encode($value) . "\";";
            }
        }
        if (!@file_put_contents($tmp_file, implode("\r\n", $ini))) {
            return false;
        }
        @chmod($tmp_file, filesystem::getChmodToWrite());
        if (IS_WINDOWS) {
            if (@file_exists($file) && !@unlink($file)) {
                return false;
            }
        }
        if (!@rename($tmp_file, $file)) {
            return false;
        }


        return true;
    }

}
class Configuration {
     const AUTO = 0;
     const JSON = 2;
     const PHP_INI = 4;
     const XML = 16;

     static private $CONF_EXT_RELATION = array(
         'json' => 2, // JSON
         'ini' => 4,  // PHP_INI
         'xml' => 16  // XML
     );

     static private $instances;

     private $data;

     static public function objectToArray($obj) {
         $arr = (is_object($obj))?
             get_object_vars($obj) :
             $obj;

         foreach ($arr as $key => $val) {
             $arr[$key] = ((is_array($val)) || (is_object($val)))?
                 self::objectToArray($val) :
                 $val;
         }

         return $arr;
     }

     private function __construct($file, $type = Configuration::AUTO) {
         if ($type == self::AUTO) {
             $type = self::$CONF_EXT_RELATION[pathinfo($file, PATHINFO_EXTENSION)];
         }

         switch($type) {
             case self::JSON:
                 $this->data = json_decode(file_get_contents($file), true);
                 break;

             case self::PHP_INI:
                 $this->data = parse_ini_file($file, true);
                 break;

             case self::XML:
                 $this->data = self::objectToArray(simplexml_load_file($file));
                 break;
         }
     }

     static public function & getInstance($file, $type = Configuration::AUTO) {
         if(! isset(self::$instances[$file])) {
             self::$instances[$file] = new Configuration($file, $type);
         }

         return self::$instances[$file];
     }

     public function __get($section) {
         if ((is_array($this->data)) &&
                 (array_key_exists($section, $this->data))) {
             return $this->data[$section];
         }
     }

     public function getAvailableSections() {
         return array_keys($this->data);
     }
 }

$configuration = Configuration::getInstance(/*configuration filename*/);
 foreach($configuration->getAvailableSections() as $pos => $sectionName) {
     var_dump($sectionName);
     var_dump($configuration->{$sectionName});
 }
 function write_php_ini($array, $file)
 {
     $res = array();
     foreach($array as $key => $val)
     {
         if(is_array($val))
         {
             $res[] = "[$key]";
             foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
         }
         else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
     }
     safefilerewrite($file, implode("\r\n", $res));
 }

function safefilerewrite($fileName, $dataToSave)
 {    if ($fp = fopen($fileName, 'w'))
     {
         $startTime = microtime();
         do
         {            $canWrite = flock($fp, LOCK_EX);
            // Если замок не получается спать 0 - 100 миллисекунд, чтобы избежать столкновения и загрузки процессора
            if(!$canWrite) usleep(round(rand(0, 100)*1000));
         } while ((!$canWrite)and((microtime()-$startTime) < 1000));

         //Файл был заперт так что теперь мы можем хранить информацию
         if ($canWrite)
         {            fwrite($fp, $dataToSave);
             flock($fp, LOCK_UN);
         }
         fclose($fp);
     }

 }

?>