2017-09-14 107 views
0

試圖找出最好的方法來做到這一點,我得到非常奇怪的結果。長話短說,我們把應用程序配置參數放在後端是python,前端PHP使用了硬編碼參數,我試圖將它綁定到單個python文件,所以我不必更改多個重要的配置參數例如,將其部署到不同的服務器。如何從python文件中使用PHP讀取變量?

蟒蛇文件(defaults.py):

import time 

#------------------------------------------------------ 
#Processing Options 
#------------------------------------------------------ 
perform_tests = False 
today = time.time() 

#------------------------------------------------------ 
#MySQL Config 
#------------------------------------------------------ 
host = "somehostname.com" 
port = 3526 
user = "someuser" 
pw = "somepass" 
db = "someDB" 
bulk = 500 
table = "Some_table" 

的PHP代碼試圖從它收集配置變量(測試代碼大部分):

<?php 
    function db_connect() { 
     $config_file = fopen("../modules/defaults.py", "r"); 
     if ($config_file) { 
      while (($line = fgets($config_file)) !== false) { 
       echo "<script>alert(". (string)$line. ");</script>"; 
       // process the line read. 
       if(substr($line, 0, 4) === "host"){ 
        //$servername = trim(explode("=",$line)[1]); 
        $servername = "somehostname.com"; 
       } 
      } 
      fclose($handle); 
     } 
     echo "<script>alert(". $servername. ");</script>"; 
     //$servername = "somehostname.com"; 
     $username = "someuser"; 
     $password = "somepass"; 
     $dbname = "someDB"; 
     $port = 3526; 
     //Create connection 
     $conn = new mysqli($servername, $username, $password, $dbname); 

     if ($conn->connect_error) { 
      die("Connection failed: " . $conn->connect_error); 
     } 
     return $conn; 
    } 
?> 

正如你可以看到,我正在通過python文件循環,試圖使用文件中的變量重新分配我的硬編碼變量......這裏有很多調試代碼。

因此,當你運行它時,它會提醒你每一行文件...非常奇怪的結果是它沒有提醒整個行(它警告「somehostname.com」,3526,「 someuser「等等,它也沒有提醒輸入時間線或註釋掉的線,這對我來說很奇怪,我希望它能夠以字符串形式讀取行,但是fgets似乎以一種非常奇怪的方式解釋代碼。

我想知道什麼是真正發生在這裏,如果有更好的方法去這個...不修改Python文件,因爲後端使用它無處不在。

感謝。

+3

我建議你考慮將配置移動到一個更標準的文件格式,如ini文件,你可以從兩種語言閱讀和輕鬆解析。 –

+0

PHP應該能夠像文本文件一樣讀取文件,但它只能讀取等號後面的內容,我覺得這很奇怪......我希望它像文本一樣對待,但它將它當作被誤解的代碼來對待。你是對的......但是,這是後端和外部軟件系統處理的巨大變化。我只是想讓它讀取文本,而不是將它解釋爲代碼...... fgets不應該這樣做。 – gunslingor

+0

我在提醒中缺少引號,這就是爲什麼它只給出了等號後的內容......仍然是奇怪的操作。 – gunslingor

回答

1

這看起來很像java .properties文件。儘管存在行調用的一些方法:

today = time.time() 

但是你可以爲string讀這些屬性,你可以找到關於閱讀的屬性文件在這個問題上有所幫助:Read .properties files using PHP

一旦你把所有加載的數據必須使用代碼評估行 - 希望您能通過密鑰識別它們。我知道這只是一般想法,但我希望你可以自己進一步。