2017-04-08 172 views
0

我无法使用parse_ini_file从ini文件加载数据。它能够使用file_get_contents读取文件,但在使用parse_ini_file时会失败。 ini文件是:无法使用parse_ini_file读取文件

[names] 
me = Robert 
you = Peter 

[urls] 
first = "http://www.example.com" 
second = "https://www.w3schools.com" 

的代码是:

echo file_exists($iniFile), "<br>"; 
echo file_get_contents($iniFile), "<br>"; 
echo "print_r parse result---->"; 
print_r(parse_ini_file($iniFile)); 
$data = parse_ini_file($iniFile); 
echo "<br>this is data-me---->", $data['me'], "<br>"; 
echo "this is data---->", $data, "<br>"; 
if(empty($data)){ 
    HHelper::logItA($folder . "/Errors", $folder . "_ini", $key . " file empty"); 
    die("\nNo data in {$key}, iniFile {$iniFile}\n"); 
} 

,输出是:

1 
[names] me = Robert you = Peter [urls] first = "http://www.example.com" second = "https://www.w3schools.com" 
print_r parse result----> 
this is data-me----> 
this is data----> 
No data in EventImport/test.ini, iniFile s3://configs.hamlethub.com/EventImport/test.ini 

我想不通为什么这个会不会被读入数组。任何帮助,将不胜感激。

+0

似乎好奇它会失败默默。我认为它返回一个布尔值false,因为print_r是空的。如果是这样的话,那肯定会失败,尽管不是很有帮助。该文档指出,从5.2.7开始,由于语法错误而返回false。也许将文件剥离成一个简单的定义,然后看看它是否会返回任何内容? – stratedge

回答

1

无视我上面的评论,你的ini文件在语法上很好,在我的机器上没有问题的解析。

如果文件位于S3上,如错误输出中$iniFile变量的值所示,则函数parse_ini_file可能不是您所需要的。对函数文档的注释说明该函数似乎不适用于远程文件:http://php.net/manual/en/function.parse-ini-file.php#37293

这就是说,它仍然可以实现你要什么,这里是我想尝试:

因为你可以用file_get_contents检索文件的内容过S3的,你可以分析文本这是返回。您可以使用函数parse_ini_string执行与parse_ini_file完成的相同的分析,并返回预期的关联数组。

$ini = file_get_contents($iniFile); 
$data = parse_ini_string($ini); 
print_r($data); 

这应该做的伎俩。

下面是parse_ini_string的文档:http://php.net/manual/en/function.parse-ini-string.php

它的价值至少提的是,有一个远程INI文件的想法在我看来是一个安全风险,这取决于使用什么ini文件的内容,所以确保你紧紧地在AWS生态系统中锁定这个文件的权限。 parse_ini_file函数可能不会联系远程计算机的原因可能只是出于安全原因(尽管他们可能已经决定由于需求低而决不执行该功能)。

+0

工作就像一个魅力!谢谢你,你救了我很多头痛。我从来没有想到这一点。我打开S3文件作为流,不知道会有什么区别。感谢您的安全提示。由于S3只对该服务器开放,因此它被锁定。 – HamletHub