Linux环境thinkphp配置以及数据源驱动修改
項目中需要用到thinkphp,以下簡稱tp。
linux版本:64位CentOS 6.4
Nginx版本:nginx1.8.0
php版本:php5.5.28
thinkphp版:3.2.3
Linux環境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新增
);
    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');綁定模板就需要權限寫目錄生成緩存文件!
?
?
開啟thinkPHP全站緩存
Think配置文件增加:
???????'DB_SQL_BUILD_CACHE' => true,
??????????????????//開啟靜態緩存
???????'HTML_CACHE_ON'?????? => true,
??????????????????'HTML_CACHE_TIME'?? =>?? 600,?? // 全局靜態緩存有效期(秒)
???????'HTML_CACHE_RULES'??? => array(
???????'*'=>array('{$_SERVER.REQUEST_URI|md5}'),
?
?
需要給/Application/Html這個目錄增加權限
# chmod -R 777 Html
原理是第一次請求生成html后在該目錄生成一個個的html,再設定的時間內直接請求靜態文件
-rw-r--r-- 1 nobody nobody 177460 Oct 1311:24 f6f0651ffb91f9bba1bb24ae0574d4f9.html
-rw-r--r-- 1 nobody nobody 162988 Oct 1311:29 f9f5ed1a3286dc39724e78dfeb3da4f4.html
-rw-r--r-- 1 nobody nobody? 20109 Oct13 11:39 fcf7fa39e34d97c4dd219d7725e6d50f.html
-rw-r--r-- 1 nobody nobody 175251 Oct 1311:34 fdaa60f6d213dfca9069e6a520c755f9.html
官方文檔:
http://document.thinkphp.cn/manual_3_2.html#html_cache
?
另外我還開啟了 SQL解析緩存也是有用的,這個主要針對第一次
?
所以如果你的應用有大量的SQL查詢需求,那么可以開啟SQL解析緩存以減少SQL解析提高性能。要開啟SQL解析緩存,只需要設置:
'DB_SQL_BUILD_CACHE'=>true,
?
總結
以上是生活随笔為你收集整理的Linux环境thinkphp配置以及数据源驱动修改的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 鹅多少钱一斤啊?
 - 下一篇: 你刺痛我心是什么歌呢