Linux環境thinkphp配置以及資料來源驅動修改
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
專案中需要用到thinkphp,以下簡稱tp。
linux版本:64位CentOS 6.4
Nginx版本:nginx1.8.0
php版本:php5.5.28
thinkphp版:3.2.3
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 !');// 開啟除錯模式 建議開發階段開啟 部署階段註釋或者設為falsedefine('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,