网站移植

把Linux上的网站移植到Windows上来,网站采用Thinkphp框架。记录下移植步骤及遇到的问题。
1. 复制源代码、数据库。数据库使用的为MySql,使用mysqldump命令备份数据库:mysqldump -uroot -p123456 dbname > /opt/www/dbname.sql。
2. windwows server 2008主机上安装apache、mysql,解压php到C:\Program Files\php,并在环境变量中添加php和php\ext
   apache:apache_2.2.9-win32-x86-openssl-0.9.8h-r2
   mysql: mysql-installer-community-5.6.28.0.msi
   php:php-5.3.5-Win32-VC6-x86.zip
3. 修改配置文件
   php.ini:
        extension_dir = "C:\Program Files\php\ext"
        extension=php_gd2.dll
        extension=php_imap.dll
        extension=php_mbstring.dll
        extension=php_exif.dll      ; Must be after mbstring as it depends on it
        extension=php_mysql.dll
        extension=php_mysqli.dll
   httpd.conf:
        把LoadModule前的 '#' 全去掉了
        添加:     LoadModule php5_module "C:/Program Files/php/php5apache2_2.dll"
                AddType application/x-httpd-php .php
                PHPIniDir "C:/Program Files/php"    
        设置网站目录    
        DirectoryIndex index.php
4. 复制源代码、数据库到Windows server主机。
   导入数据库时使用mysqldump会出错,使用如下方法导入:(网站中连接数据库所用用户名秘密并非root,使用的为dbuser,因此此处要添加用户)
    //登录MYSQL
    >mysql -u root -p
    >密码
    //创建用户,用户名dbuser,密码dbpassword
    GRANT USAGE ON *.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpassword' WITH GRANT OPTION;

    //创建一个数据库(dbname)
    mysql>create database dbname;

    //切换到数据库dbname
    mysql>use dbname;

    //导入数据
    mysql>source dbname.sql;

    //授权dbuser用户拥有dbname数据库的所有权限
    grant all  on dbname.* to dbuser@localhost identified by 'dbpassword';

出现的问题及解决办法:
1. 页面跳转问题。点击页面元素无法跳转,查看其链接为127.0.0.1/aa/bb,但127.0.0.1/index.php/aa/bb可正常访问。
   解决方法:修改apache配置文件去除thinkphp url中的index.php
            把 LoadModule rewrite_module modules/mod_rewrite.so 前的'#'去掉
            AllowOverride None 将None改为 All
2. 不显示验证码
   解决方法:因为php已加载gd库,并且也没发现php中有bom,于是添加 ob_clean(),显示验证码。(验证码是显示了,又造成了后面的问题,待会这儿还要改)
3. 点击登录没有反应
   查看登录按钮的js处理:
   $("#frm_login").ajaxSubmit({
                    type:"post",
                    url:url,
                    dataType:"json",
                    success:function(data){
                        if(data[0] == "ok")
                        {
                            ......
                        }
                        else
                        {
                            ......
                        }
                    }
                });
    发现不执行success,网上搜原因($.ajax返回的JSON格式的数据后无法执行success的解决方法)发现,指定了dataType:'json',对Json格式的要求就非常严格起来了,必须要这种格式的{"键":"值","键":"值"}。那就是JSON数据的问题了,把dataType:"json" 改为 dataType:"html",然后通过alert(data)查看data的内容,发现data为:
    <br /><b>Notice</b>:  Undefined index: auto_login in <b>C:\www\chexiaobao\cxb\libs\models\UserModel.class.php</b> on line <b>501</b><br />["ok"]
    难怪不执行,明显不是Json格式,还出错了,网上查php中Undefined index的解决方法,修改 php.ini 中的error_reporting = E_ALL 修改为 error_reporting = E_ALL & ~E_NOTICE,重启下APCHE服务器,需改后data为:
    ["ok"]
    好了,改回dataType:"json",执行,却发现了另一个问题,登录后页面不跳转,需刷新下才跳转。
4. 登录后页面不跳转
   这个地方看了好久也没发现问题,突然想到在显示验证码时添加了 ob_clean(),把缓存给清了,而原来的代码中并没有这一句,难道是这里的问题?那去了这一句怎么显示验证码呢?不显示验证码肯定有地方存在bom,写脚本查找bom:
    <?php  
    if (isset ( $_GET ['dir'] ))
    {
        //config the basedir    
        $basedir = $_GET ['dir'];
    }
    else
    {    
        $basedir = '.';  
    }    
      
    echo $basedir;
    checkdir ( $basedir );    
    
    function get_extension($file)
    {
        return pathinfo($file, PATHINFO_EXTENSION);
    }

    function checkdir($basedir)
    {    
        if ($dh = opendir ( $basedir ))
        {    
            while ( ($file = readdir ( $dh )) !== false )
            {    
                if ($file != '.' && $file != '..')
                {    
                    if (! is_dir ( $basedir . "/" . $file ))
                    {
                        // 如果是文件    
                        if (get_extension($file) == "php" )
                        {
                            checkBOM ( "$basedir/$file" );
                        }
                        
                    }
                    else
                    {    
                        //echo $basedir;
                        //echo "\n";
                        $dirname = $basedir . "/" .$file; // 如果是目录    
                        checkdir ( $dirname ); // 递归    
                    }    
                }    
            }    
            closedir ( $dh );    
        }    
    }    
      
    function checkBOM($filename)
    {        
        global $auto;    
        $contents = file_get_contents ( $filename );    
        $charset [1] = substr ( $contents, 0, 1 );    

        if ( $charset [1] != "<" || ord ( $charset [1] ) == 239)
        {
            echo $filename;
            echo "\n";
        }
    }    
    ?>
    改的网上的代码,运行代码,发现显示验证码的那个php开头果然有bom,一开始没发现......去掉bom,然后去掉ob_clean(),验证码显示成功,再登录成功跳转。

你可能感兴趣的:(网站移植)