【问题标题】:How to read and write to an ini file with PHP如何使用 PHP 读取和写入 ini 文件
【发布时间】:2011-08-07 09:34:07
【问题描述】:

我一直在寻找官方的 php 文档,但找不到我要找的东西。

http://php.net/manual/en/function.parse-ini-file.php

我只想要一个函数来编辑和读取 php ini 文件中的值,例如,

[default_colors]
sitebg = #F8F8F8
footerbg = #F8F8F8
link = #F8F8F8
url = #F8F8F8
bg = #F8F8F8
text = #F8F8F8
border = #F8F8F8

lu_link = #F8F8F8
lu_url = #F8F8F8
lu_bg = #F8F8F8
lu_text = #f505f5
lu_border = #F8F8F8
  1. 如何读取属于“lu_link”或“footerbg”的值?
  2. 如何为这些地方编写新值?

【问题讨论】:

标签: php ini


【解决方案1】:

您可以简单地将parse_ini_file 与 PHP4/5 一起使用。

$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);

这里是文档:http://php.net/manual/en/function.parse-ini-file.php

要将一组对象写回 ini 文件,请使用以下方法作为一个非常快速且简单的解决方案:

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(TRUE);
        do
        {            $canWrite = flock($fp, LOCK_EX);
           // If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
           if(!$canWrite) usleep(round(rand(0, 100)*1000));
        } while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5));

        //file was locked so now we can store information
        if ($canWrite)
        {            fwrite($fp, $dataToSave);
            flock($fp, LOCK_UN);
        }
        fclose($fp);
    }

}

【讨论】:

  • 谢谢,但我已经搜索过这个,因为我对 php 很陌生,一目了然
  • safefilerewrite 是用户制作的功能。如果您转到答案中列出的 php 文档并在 cmets 中搜索 safefilerewrite,您将看到一个可能的示例。
  • 它可以与[section1] lines [section2] lines 一起使用吗?
【解决方案2】:

PEAR Config_Lite 包可以超级轻松地为您完成几乎所有的工作(包括阅读和写作)。在这里查看:http://pear.php.net/package/Config_Lite

【讨论】:

  • 天哪,这看起来很棒!但我对 php 和编程很陌生,PEAR 是什么?什么是框架?这可以在我的托管网站中使用吗?
  • 好的,我已经安装并下载了模块并让它读取了一个 ini 文件:P 谢谢。但是你能告诉我更多关于什么是框架以及为什么我必须安装 pear 的信息吗?为什么 config_lite 被称为“模块”?我真的很想以正确的方式学习这个。
  • 当然,没问题。简而言之,PEAR 是“模块”的集合——通用的,但专门为您编写的 PHP 代码,用于自动化和简化众多任务。您必须单独安装它,因为它是由爱好者编写和维护的,而且它提供的解决方案太大且太具体,无法真正成为核心 PHP 语言的一部分。 Config_lite 只是众多模块中的一个;其中包括完整的 Config 模块,与 config_lite 类似,但功能更多。
  • 我在保存 ini 文件时遇到了一个大问题,我已经尝试过这个 outised pear,它在键值周围添加了 "",而不是 ""。
  • Config_Lite 也可以由 composer 使用(参见github
【解决方案3】:

这个怎么样:

 $key='option';
 $val='1.2.3.4.5';
 system("sed  -ie  's/\({$key}=\)\(.*\)/\1{$val}/' file.in");

【讨论】:

    【解决方案4】:

    下面是 PHP 目前缺少的 write_ini_file() 的实现,它将创建一个几乎相同的输入(除了 cmets):

    • 支持跨平台 (PHP_EOL) 在部分之间添加新行。
    • 处理索引和键值数组。
    • 处理 CONSTANT 样式值。
    • 并且文件锁定保持一致。

    来源

    <?php
    if (!function_exists('write_ini_file')) {
        /**
         * Write an ini configuration file
         * 
         * @param string $file
         * @param array  $array
         * @return bool
         */
        function write_ini_file($file, $array = []) {
            // check first argument is string
            if (!is_string($file)) {
                throw new \InvalidArgumentException('Function argument 1 must be a string.');
            }
    
            // check second argument is array
            if (!is_array($array)) {
                throw new \InvalidArgumentException('Function argument 2 must be an array.');
            }
    
            // process array
            $data = array();
            foreach ($array as $key => $val) {
                if (is_array($val)) {
                    $data[] = "[$key]";
                    foreach ($val as $skey => $sval) {
                        if (is_array($sval)) {
                            foreach ($sval as $_skey => $_sval) {
                                if (is_numeric($_skey)) {
                                    $data[] = $skey.'[] = '.(is_numeric($_sval) ? $_sval : (ctype_upper($_sval) ? $_sval : '"'.$_sval.'"'));
                                } else {
                                    $data[] = $skey.'['.$_skey.'] = '.(is_numeric($_sval) ? $_sval : (ctype_upper($_sval) ? $_sval : '"'.$_sval.'"'));
                                }
                            }
                        } else {
                            $data[] = $skey.' = '.(is_numeric($sval) ? $sval : (ctype_upper($sval) ? $sval : '"'.$sval.'"'));
                        }
                    }
                } else {
                    $data[] = $key.' = '.(is_numeric($val) ? $val : (ctype_upper($val) ? $val : '"'.$val.'"'));
                }
                // empty line
                $data[] = null;
            }
    
            // open file pointer, init flock options
            $fp = fopen($file, 'w');
            $retries = 0;
            $max_retries = 100;
    
            if (!$fp) {
                return false;
            }
    
            // loop until get lock, or reach max retries
            do {
                if ($retries > 0) {
                    usleep(rand(1, 5000));
                }
                $retries += 1;
            } while (!flock($fp, LOCK_EX) && $retries <= $max_retries);
    
            // couldn't get the lock
            if ($retries == $max_retries) {
                return false;
            }
    
            // got lock, write data
            fwrite($fp, implode(PHP_EOL, $data).PHP_EOL);
    
            // release lock
            flock($fp, LOCK_UN);
            fclose($fp);
    
            return true;
        }
    }
    

    示例输入.ini 文件(取自http://php.net/manual/en/function.parse-ini-file.php

    ; This is a sample configuration file
    ; Comments start with ';', as in php.ini
    
    [first_section]
    one = 1
    five = 5
    animal = BIRD
    
    [second_section]
    path = "/usr/local/bin"
    URL = "http://www.example.com/~username"
    
    [third_section]
    phpversion[] = "5.0"
    phpversion[] = "5.1"
    phpversion[] = "5.2"
    phpversion[] = "5.3"
    
    urls[svn] = "http://svn.php.net"
    urls[git] = "http://git.php.net"
    

    使用示例:

    // load ini file values into array
    $config = parse_ini_file('config.ini', true);
    
    // add some additional values
    $config['main']['foobar'] = 'baz';
    $config['main']['const']['a'] = 'UPPERCASE';
    $config['main']['const']['b'] = 'UPPER_CASE WITH SPACE';
    $config['main']['array'][] = 'Some Value';
    $config['main']['array'][] = 'ADD';
    $config['third_section']['urls']['docs'] = 'http://php.net';
    
    // write ini file
    write_ini_file('config.ini', $config);
    

    生成的.ini 文件:

    [first_section]
    one = 1
    five = 5
    animal = BIRD
    
    [second_section]
    path = "/usr/local/bin"
    URL = "http://www.example.com/~username"
    
    [third_section]
    phpversion[] = 5.0
    phpversion[] = 5.1
    phpversion[] = 5.2
    phpversion[] = 5.3
    urls[svn] = "http://svn.php.net"
    urls[git] = "http://git.php.net"
    urls[docs] = "http://php.net"
    
    [main]
    foobar = "baz"
    const[a] = UPPERCASE
    const[b] = "UPPER_CASE WITH SPACE"
    array[] = "Some Value"
    array[] = ADD
    

    【讨论】:

      【解决方案5】:

      这是一个创建可写入文件的字符串的功能版本。

      function IniAsStr(array $a) : string
      {
          return array_reduce(array_keys($a), function($str, $sectionName) use ($a) {
              $sub = $a[$sectionName];
              return $str . "[$sectionName]" . PHP_EOL .
                  array_reduce(array_keys($sub), function($str, $key) use($sub) {
                      return $str . $key . '=' . $sub[$key] . PHP_EOL;
                  }) . PHP_EOL;
            });
      }
      

      【讨论】:

        【解决方案6】:

        这是您使用类别选项读写INI文件的函数!

        如果您提供多维数组,您的 INI 文件中将包含类别。 或者基本数组可以让你快速读写数据。

        详情请参阅下面的 cmets 和示例:

        ### PHP write_ini_file function to use with parse_ini_file: (choose one of the two example arrays below...)
        $array = array('category' => array('color' => 'blue', 'size' => 'large'));
        // $array = array('color' => 'red', 'size' => 'small');
        function write_ini_file($array, $path) {
            unset($content, $arrayMulti);
        
            # See if the array input is multidimensional.
            foreach($array AS $arrayTest){
                if(is_array($arrayTest)) {
                  $arrayMulti = true;
                }
            }
        
            # Use categories in the INI file for multidimensional array OR use basic INI file:
            if ($arrayMulti) {
                foreach ($array AS $key => $elem) {
                    $content .= "[" . $key . "]\n";
                    foreach ($elem AS $key2 => $elem2) {
                        if (is_array($elem2)) {
                            for ($i = 0; $i < count($elem2); $i++) {
                                $content .= $key2 . "[] = \"" . $elem2[$i] . "\"\n";
                            }
                        } else if ($elem2 == "") {
                            $content .= $key2 . " = \n";
                        } else {
                            $content .= $key2 . " = \"" . $elem2 . "\"\n";
                        }
                    }
                }
            } else {
                foreach ($array AS $key2 => $elem2) {
                    if (is_array($elem2)) {
                        for ($i = 0; $i < count($elem2); $i++) {
                            $content .= $key2 . "[] = \"" . $elem2[$i] . "\"\n";
                        }
                    } else if ($elem2 == "") {
                        $content .= $key2 . " = \n";
                    } else {
                        $content .= $key2 . " = \"" . $elem2 . "\"\n";
                    }
                }
            }
        
            if (!$handle = fopen($path, 'w')) {
                return false;
            }
            if (!fwrite($handle, $content)) {
                return false;
            }
            fclose($handle);
            return true;
        }
        
        write_ini_file($array,'./data.ini');
        $readData = parse_ini_file('./data.ini',true);
        print_r($readData);
        

        【讨论】:

          【解决方案7】:

          您可以简单地使用ini_set('lu_link','#000000');ini_get('lu_link')

          【讨论】:

          • 我觉得,您还没有阅读用户提出的问题。这不是关于编辑 php.ini,而是关于编辑自定义的 *.ini 文件。
          猜你喜欢
          • 2015-09-17
          • 2014-09-17
          • 2013-06-01
          • 1970-01-01
          • 2017-03-07
          • 2012-12-01
          • 2010-10-14
          • 1970-01-01
          相关资源
          最近更新 更多