2017-09-14 94 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

一旦你把所有加载的数据必须使用代码评估行 - 希望您能通过密钥识别它们。我知道这只是一般想法,但我希望你可以自己进一步。