2017-04-08 121 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