您的位置:首页 > 运维架构 > Linux

Linux环境thinkphp配置以及数据源驱动修改

2015-08-18 15:26 531 查看
项目中需要用到thinkphp,以下简称tp。

linux版本:64位CentOS 6.4Nginx版本:nginx1.8.0php版本:php5.5.28thinkphp版:3.2.3
1.安装LNMPLinux环境Nginx安装与调试以及PHP安装

2.项目框架
tp源码下载http://www.thinkphp.cn/
最新文档http://www.kancloud.cn/manual/thinkphp/1682
下载框架后,解压缩到web目录下面,可以看到初始的目录结构如下:
1.www WEB部署目录(或者子目录)
2.├─index.php 入口文件
3.├─README.md README文件
4.├─Application 应用目录
5.├─Public 资源文件目录
6.└─ThinkPHP 框架目录

说明:需要修改网站根目录下的runtime目录权限
#chmod 777 ./Runtime/
根目录下index.php

if (version_compare(PHP_VERSION, '5.3.0', '<'))
    die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG', TRUE);
/**
 * 缓存目录设置
 * 此目录必须可写,建议移动到非WEB目录
 */
define('RUNTIME_PATH', './Runtime/');

//定义公共模块的目录,放到应用目录外
define('COMMON_PATH', './Common/');

//关闭目录安全文件的生成
define('BUILD_DIR_SECURE', false);

// 定义应用目录
define('APP_PATH', './Application/');

//define('BIND_MODULE','Admin');

// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';

// 亲^_^ 后面不需要任何代码了 就是如此简单


修改Nginx配置

server {
	listen       81;
        server_name  localhost;

    location / {
        index  index.htm index.html index.php;
        #访问路径的文件不存在则重写URL转交给ThinkPHP处理
        if (!-e $request_filename) {
           rewrite  ^/(.*)$  /index.php/$1  last;
           break;
        }
    }
    location ~ \.php/?.*$ {
        root        /usr/wwwtp;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        #加载Nginx默认"服务器环境变量"配置
        include        fastcgi.conf;
        
        #设置PATH_INFO并改写SCRIPT_FILENAME,SCRIPT_NAME服务器环境变量
        set $fastcgi_script_name2 $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+\.php)(/.+)$") {
            set $fastcgi_script_name2 $1;
            set $path_info $2;
        }
        fastcgi_param   PATH_INFO $path_info;
        fastcgi_param   SCRIPT_FILENAME   $document_root$fastcgi_script_name2;
        fastcgi_param   SCRIPT_NAME   $fastcgi_script_name2;
    }
}
在浏览器输入 http://localhost/index.php 预览首页
子页面本来是:
http://localhost/index.php/Home/school/select
经过URL重写以后是:
http://localhost/Home/school/select
如果需要去掉Home可以继续修改上面的重写规则:
rewrite ^/(.*)$ /index.php/Home/$1 last;
http://localhost/school/select

3.thinkphp的MVC结构
项目文件结构



如上图所示在Controller目录中新建一个SchoolController.class.php

在SchoolController.class.php新建一个index的方法

namespace Home\Controller;
use Think\Controller;
class SchoolController extends Controller {
    public function index(){
        
        echo "Hello Thinkphp!";
    }
}


在浏览器输入:http://192.168.0.104:81/home/school/index



4.数据库配置
参考官方文档:ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。目前包含了Mysql、SqlServer、PgSQL、Sqlite、Oracle、Ibase、Mongo等数据库的支持,并且采用PDO方式。

如果是mysql就很简单按照官方的教程做就可以,如果是SQLserver或者其他数据库就会有些麻烦,需要稍稍做些修改。
另外关于linux环境PHP连接SQLserver可以参考此文:Linux环境PHP5.5以上连接SqlServer2008
首先需要改配置文件Common/conf/config.php,下面是sqlserver的配置:

return array(
	//'配置项'=>'配置值'
        'DB_TYPE'   => 'sqlsrv', // 数据库类型		
        'DB_USER'   => 'unix21', // 用户名
        'DB_PWD'    => '123456', // 密码
        'DB_PORT'   => 1433, // 端口
        'DB_PREFIX' => '', // 数据库表前缀
        'DB_DSN'       =>  'dblib:host=XXX:1433;dbname=XXX',  
        'DB_CHARSET'=> 'utf8', // 字符集
        'DB_DEBUG'  =>  TRUE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增
);


在SchoolController.class.php新增一个accout的方法
public function account(){
         header("Content-type: text/html; charset=utf-8");
         dump(M('account')->select());
    }


注意:需要修改Sqlsrv.class.php中的代码,注释PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
文件位置如图所示:



不然会报错:

Undefined class constant 'PDO::SQLSRV_ATTR_ENCODING'

错误位置

FILE: /usr/wwwtp/ThinkPHP/Library/Think/Db.class.php  LINE: 39



注释掉哪行代码以后可以正常显示:



此外,如果需要自己写sql可以这样:

header("Content-type: text/html; charset=utf-8");
       //dump(M('account')->select());    
       $Model = new \Think\Model();
       $result=$Model->query("select top 10 * from account;");
       dump($result);


其实thinkphp底层还是使用PDO连接数据库,可以自己修改Driver.class.php.
注释这一行

$this->linkID[$linkNum] = new PDO( $config['dsn'], $config['username'], $config['password'],$this->options);

改为硬编码就知道前面的配置还是在这里被使用:

$this->linkID[$linkNum] = new PDO( "dblib:host=192.168.1.235:1433;dbname=XXX","unix21","password",$this->options);




在浏览器一样显示出数据。

因为开发中总是会遇到一些特殊需求,所以,如果有需要就可以自己写一个底层的数据源驱动或者在tp的基础上做修改就可以了。

要想用好一个框架还是需要去读一读其源码,搞清楚其运行原理,达到为我所用,而不应该是用了几年框架都不知道底层怎么回事。

tp开启调试模式配置文件增加代码'SHOW_PAGE_TRACE' => TRUE,
thinkphp的坑
由于我们目前是tp+sqlserver所以估计使用的人不多,导致bug很少暴漏。
1).表名
除了首字母以外中间的一律小写。
2).where条件
必须按数据库里字段一样,例如数据库是ID那么你也要写ID,数据库是State你也要写State。

$map['State'] =2;
$map['ID'] = 5;
//数据库原表名是GJGZNews,如果你写为M('GJGZNews')那么会被TP变为G_J_G_Z_News
$news=M('gjgznews')->where($map)->select();
dump($news);

权限问题

_STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/b39761fdd01eadcd4b8a82f371520558.php

├─Runtime 运行时目录
│ ├─Cache 模版缓存目录
│ ├─Data 数据目录
│ ├─Logs 日志目录
│ └─Temp 缓存目录模版缓存目录Cache下的Home目录需要权限# chmod 777 ./Home/
原因是$this->display('list');绑定模板就需要权限写目录生成缓存文件!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: