一个python 下写PHP 文件引起的奇怪BUG

前些天,小赚800,给客户定制了一个一键部署PHP安装包的插件,客户在实际使用中,发现一个奇葩的问题

客户部署的网站,验证码显示乱码。客户怀疑,是我在python 下写php 中网站数据库的配置文件时编码出错导致的,为此我从客户那里要来了客户一键部署的网站的模版(已征求客户同意,作为附件公开此模版 模版下载地址)模版部署环境 PHP5.2 ,分别就python 写入UTF-8、GB2312 编码的php 配置文件进行了测试,均未解觉此问题。我通过修改客户php代码,发现客户的数据库是正常连接的,也就说其实配置文件没有问题。百思不得其解的时候,客户给出了一个临时解觉方案,方法是使用php 读取原先的配置文件,然后重新写入到配置文件,这样验证码就能正常显示了。你马,居然还有这种操作...我仔细校对核验了使用PHP 重写配置之前的两份不同的配置文件 conf.inc.php 均没有发现问题。

这里贴上 客户自己写的php 配置重写代码

<?php
define("ROOTPATH", "");
include_once ('base/nusoap/nusoap.php');
include_once ('includes/data.inc.php');
include(ROOTPATH."config.inc.php");

$ConFile="./config.inc.php";
$SysConfigFile="./inc.php";

$siteurl="http://".$_SERVER["HTTP_HOST"]."/";

$filestr = fread(fopen($SysConfigFile, 'r'),30000);
$filestr=str_replace(" ","",$filestr);
$filestr=str_replace("DefaultDbHost",$dbHost,$filestr);
$filestr=str_replace("DefaultDbName",$dbName,$filestr);
$filestr=str_replace("DefaultDbUser",$dbUser,$filestr);
$filestr=str_replace("DefaultDbPass",$dbPass,$filestr);
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
$filestr=str_replace("DefaultTablePre",$TablePre,$filestr);
$filestr=str_replace("DefaultSiteUrl",$SiteUrl,$filestr);

fwrite(fopen($ConFile,"w"),$filestr,30000);
?>

非常奇怪,为什么客户把配置文件的代码如此重写一遍就没有问题了呢?不过,既然有了正确的配置文件,那么还怕什么...

我分别拷贝下载了服务器上一键配置时自动写的php 配置文件,和通过客户的脚本修改后的配置文件到本地,使用二进制的方法读写文件仔细对比

发现,两份文件的不同之处在于配置文件中<?php 符号的开始位置,使用python 写的配置文件前面有个回车字符.... en,回车字符?

原来,客户的代码是在win 下开发的,部分php 文件使用GBK 编码,当我使用 python 将配置文件的信息写入到config.inc.php 时,由于最前面有个回车,恰巧linux 下回车字符和win 下回车字符的标识方法不同,用户开发的php 网站读取文件时,由于编码问题,未能正常识别linux 下的在<?php 外部的\n导致程序出错....

在最后贴上修改前后的一键部署配置部分的关键代码

修改前

修改后

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注