把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 [email protected] 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(),验证码显示成功,再登录成功跳转。