对iWebShop测试的一些技巧和心得分享1

经过数日来对iwebshop无休止的折腾,从2.6x一直折腾到了3.0x版本,发现了许许多的问题,其中很多也找到了解决方法,有的问题有待官方在以后的版本升级中处理,另外一些问题,经过自己小小的修改就能搞定。现在把我发现的问题和解决的方法和小伙伴们分享,同时记录下来也可以防止自己今后忘记的时候来查证。有些问题我没有发现,有的代码可以更加精简,有的方法也许不是最佳的方法,但是确实使问题得到了解决,希望大家都来共同讨论。 


 以下大部分问题在最新的3.0版本中都存在,有的不能算问题,但涉及到用户的使用习惯、页面友好度等,所以一并列出。


我的测试环境是:万网linux主机,伪静态模式。iwebshop版本:3.0.15011000 


1.iwebshop在万网主机的伪静态问题 
问  题:万网的伪静态无法实现。 
解决方法:针对万网主机修改伪静态规则代码。 
解决步骤:修改/lib/core/util/urlmanager_class.php文件。 
在大约909行左右找到:class IServerVars_Apache implements IIServerVars,将其下面的代码 
 public function realUri() 
{ 
return $_SERVER['PHP_SELF']; 
} 
替换为: 
 public function realUri() 
   { 
               if(strpos($_SERVER['PHP_SELF'],$_SERVER['SCRIPT_NAME']) === false) 
               { 
                       return $_SERVER['SCRIPT_NAME'].$_SERVER['PHP_SELF']; 
               } 


               $php_self = $_SERVER['QUERY_STRING'] ? $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] : $_SERVER['PHP_SELF']; 


               if(strpos($_SERVER['REQUEST_URI'],$_SERVER['SCRIPT_NAME']) === false && ($php_self != ($_SERVER['SCRIPT_NAME'].$_SERVER['REQUEST_URI']))) 
               { 
                       return str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['SCRIPT_NAME'].$_SERVER['REQUEST_URI']); 
               } 


               return $_SERVER['PHP_SELF']; 
    } 
问题解决。 



2.万网的邮件问题。 
问  题:万网主机禁用了sockets扩展,iwebshop的SMTP邮件无法发出。 
解决方法:万网虽禁用了sockets扩展,但允许使用fsockopen函数,于是我们就得到了解决方法。 
解决步骤:1.进入万网的主机控制台-主机高级设置,打开fsockopen()函数 
2.修改/lib/core/util/phpmailer/class.smtp.php文件,大约在215行左右,找到以下代码: 
        $this->smtp_conn = @stream_socket_client( 
           $host . ":" . $port, 
           $errno, 
           $errstr, 
           $timeout, 
           STREAM_CLIENT_CONNECT, 
           $socket_context 
       ); 
将其改为fsockopen函数的方式:$this->smtp_conn = @fsockopen("你的SMTP地址","端口",$errno,$errstr,$timeout);问题解决。我为了修改简便,直接使用了固定的SMTP地址和端口,这个你可以根据需要,或使用固定的,也可以获取传递的变量,具体代码不再叙述。 


3.搜索栏的空提交问题 
问  题:不输入任何数据时,直接按搜索,会出现错误提示,这一特征使页面显得不够友好,即使最新的3.0版本依然也有这个问题。 
解决方法:使页面友好点,在用户未输入直接按搜索的时候,搜索指定的关键字或提示输入内容。 
具体步骤:提示用户输入内容代码较为简单,但依然不够友好,所以我采用了直接展示指定的内容。 
          修改/views/default/layouts/site.html文件,在文件结尾最下方js代码处找到以下代码: 
      <script type='text/javascript'> 
      $(function() 
      { 
    {set:$word = IReq::get('word') ? IFilter::act(IReq::get('word'),'text') : '请输入关键字...'} 
       ...... 
将“请输入关键字...”替换为你指定的关键字,如“数码相机”,然后再将文件开始部分的<input class="text" type="text" name='word' autocomplete="off" value="请输入关键字..." />也替换为你指定的关键字,如“数码相机”,问题解决。 


4.伪静态状态下付款成功、密码发送成功等(除了默认的“操作成功”正常)页面乱码问题。 
问  题:在伪静态环境下(URL方式正常),付款成功、密码发送成功、充值成功等所有成功的提示页面都会出现乱码(除了默认的“操作成功”) 
解决方法:仔细看了看代码,发现所有在给地址栏传递中文的时候都用到了UrlEncode编码,就是为了避免出现乱码,但是success文件在提取中文的时候,并未用UrlDecode解码,所以会出现乱码,至于为什么只有伪静态时出现,我并未去研究,只是解决问题即可。 
具体步骤:修改/views/default/site/success.html文件,将页首添加{set:$msg = IReq::get('message') ? IReq::get('message') : '操作成功!'},然后将输出的代码<strong class="f14">.....</strong>中间内容替换为:{echo:UrlDecode($msg)} 问题解决。 


5.错误日志极大占用主机空间的问题,空间塞满后会导致不显示验证码、后台菜单消失等奇怪问题。 
问  题:iwebshop会自动记录错误日志,在网站调试的时候无疑作用很大,但在小伙伴们捉襟见肘的虚拟主机空间上来说,太浪费了。在我测试的短短几天时间,/backup/errorLog/目录下的错误日志达到了好几个G,曾有好几次因为错误日志塞满了虚机空间,导致登录后台不显示验证码、登录之后菜单消失等奇怪问题。 
解决方法:这个解决方法比较简单,直接将主机/backup/errorLog目录的写入权限取消就行了,但我有一点点的强迫症,总觉得虽然空间没损失,但系统或许有一些计算资源的浪费,所以,我的方法是直接注释掉了写日志的代码。 
具体步骤:打开/lib/core/util/exception_class.php文件,在第249行左右找到如下代码,直接注释掉即可(或许还有更好的方法,我顺藤摸瓜找到这个文件,修改了一下凑效了,就没再深究。) 
 $fp = fopen(self::$logPath,"ab"); 
if($fp !== false) 
{ 
fwrite($fp,$str); 
}