一.調試模式
define('APP_DEBUG', true);
調試模式的優勢在于:
-
- 開啟日志記錄,任何錯誤信息和調試信息都會詳細記錄,便于調試;
- 關閉模板緩存,模板修改可以即時生效;
- 記錄SQL日志,方便分析SQL;
- 關閉字段緩存,數據表字段修改不受緩存影響;
- 嚴格檢查文件大小寫(即使是Windows平臺),幫助你提前發現Linux部署可能導致的隱患問題;
- 通過頁面Trace功能更好的調試和發現錯誤;?
-
'SHOW_ERROR_MSG' => true, // 顯示錯誤信息
'SHOW_ERROR_MSG' => false,
'ERROR_MESSAGE' => '發生錯誤!'
'ERROR_PAGE' =>'/Public/error.html'
'LOG_RECORD' => true, // 開啟日志記錄
'LOG_LEVEL' =>'EMERG,ALERT,CRIT,ERR', // 只記錄EMERG ALERT CRIT ERR 錯誤
// 顯示頁面Trace信息
'SHOW_PAGE_TRACE' =>true,斷點調試,可用trace()方法
變量調試 ?? dump()方法
性能調試 G()方法
錯誤調試 E()方法
模型調試 getLastSql()方法
getDbError()方法
二.數據緩存
緩存類型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache
S(array(
'type'=>'memcache',
'host'=>'192.168.1.10',
'port'=>'11211',
'prefix'=>'think',
'expire'=>60)
);
快速緩存Data數據,保存到指定的目錄 ? ? F('data',$Data,TEMP_PATH);
查詢緩存 $Model->cache('cache_name')->select();
$value = S('cache_name');
SQL解析緩存 'DB_SQL_BUILD_CACHE' => true,
靜態緩存 'HTML_CACHE_ON' => true, // 開啟靜態緩存
'HTML_CACHE_TIME' => 60, // 全局靜態緩存有效期(秒)
'HTML_FILE_SUFFIX' => '.shtml', // 設置靜態緩存文件后綴
'HTML_CACHE_RULES' => array( // 定義靜態緩存規則
// 定義格式1 數組方式
'靜態地址' => array('靜態規則', '有效期', '附加規則'),
// 定義格式2 字符串方式
'靜態地址' => '靜態規則',
)
三.安全
輸入過濾
使用系統內置的I函數
是避免輸入數據出現安全隱患的重要手段,I函數默認的過濾方法是htmlspecialchars
I('get.title','','strip_tags'); // 用strip_tags過濾$_GET['title']
$this->data($data)->filter('strip_tags')->add();
表單合法性檢測
namespace Home\Model;
class UserModel extends \Think\Model{
protected $insertFields = array('account','password','nickname','email');
protected $updateFields = array('nickname','email');
}
在使用的時候,我們調用create方法的時候,會根據提交類型自動識別insertFields和updateFields屬性
M('User')->field('account,password,nickname,email')->create();
表單令牌
在應用或者模塊的配置目錄下面的行為定義文件tags.php中
return array(
// 添加下面一行定義即可
'view_filter' => array('Behavior\TokenBuild'),
// 如果是3.2.1版本 需要改成
// 'view_filter' => array('Behavior\TokenBuildBehavior'),
);
'TOKEN_ON' => true, // 是否開啟令牌驗證 默認關閉
'TOKEN_NAME' => '__hash__', // 令牌驗證的表單隱藏字段名稱,默認為__hash__
'TOKEN_TYPE' => 'md5', //令牌哈希驗證規則 默認為MD5
'TOKEN_RESET' => true, //令牌驗證出錯后是否重置令牌 默認為true
模型類在創建數據對象的同時會自動進行表單令牌驗證操作,如果你沒有使用create方法創建數據對象的話,則需要手動調用模型的autoCheckToken
方法進行表單令牌驗證。如果返回false,則表示表單令牌驗證錯誤
防止SQL注入
系統會對數據進行強制的數據類型檢測,并且對數據來源進行數據格式轉換 escape_string
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
-
- 對所有公共的操作方法做必要的安全檢查,防止用戶通過URL直接調用;
- 不要緩存需要用戶認證的頁面;
- 對用戶的上傳文件,做必要的安全檢查,例如上傳路徑和非法格式;
- 如非必要,不要開啟服務器的目錄瀏覽權限;
- 對于項目進行充分的測試,不要生成業務邏輯的安全隱患(這可能是最大的安全問題);
- 最后一點,做好服務器的安全防護;
?
四.類庫擴展
公共類庫? 指ThinkPHP/Library
目錄下面的類庫
?如果你的類庫沒有采用命名空間的話,需要使用import方法先加載類庫文件,然后再進行實例化,例如:我們定義了一個Counter類(位于Com/Sina/Util/Counter.class.php):
應用類庫 在應用或者模塊目錄下面的類庫
驅動擴展 緩存驅動默認位于Think\Cache\Driver
命名空間下面?
提供了包括APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache緩存方式的驅動擴展,緩存驅動必須繼承Think\Cache類,并實現下面的驅動接口:
五.專題
session(array('name'=>'session_id','expire'=>3600));
session('name',null); // 刪除name ??
session(null); // 清空當前的session
session('[pause]'); // 暫停session寫入
session('[start]'); // 啟動session
session('[destroy]'); // 銷毀session
session('[regenerate]'); // 重新生成session id
?
$User = M('User'); // 實例化User對象
$count = $User->where('status=1')->count();// 查詢滿足要求的總記錄數
$Page = new \Think\Page($count,25);// 實例化分頁類 傳入總記錄數和每頁顯示的記錄數(25)
$show = $Page->show();// 分頁顯示輸出
// 進行分頁數據查詢 注意limit方法的參數要使用Page類的屬性
$list = $User->where('status=1')->order('create_time')->limit($Page->firstRow.','.$Page->listRows)->select();
$this->assign('list',$list);// 賦值數據集
$this->assign('page',$show);// 賦值分頁輸出
$this->display(); // 輸出模板
?
public function upload(){
$upload = new \Think\Upload();// 實例化上傳類
$upload->maxSize = 3145728 ;// 設置附件上傳大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->savePath = './Public/Uploads/'; // 設置附件上傳目錄
// 上傳文件
$info = $upload->upload();
if(!$info) {// 上傳錯誤提示錯誤信息
$this->error($upload->getError());
}else{// 上傳成功
$this->success('上傳成功!');
}
}
?
$Verify = new \Think\Verify();
$Verify->entry();
?
$image = new \Think\Image();
$image->open('./1.jpg');
$width = $image->width(); // 返回圖片的寬度
$height = $image->height(); // 返回圖片的高度
$image->crop(400, 400)->save('./crop.jpg');
$image->thumb(150, 150)->save('./thumb.jpg');
?
REST(Representational State Transfer表述性狀態轉移)是一種針對網絡應用的設計和開發方式,可以降低開發的復雜性,提高系統的可伸縮性。REST提出了一些設計概念和準則:
1、網絡上的所有事物都被抽象為資源(resource);
2、每個資源對應一個唯一的資源標識(resource identifier);
3、通過通用的連接器接口(generic connector interface)對資源進行操作;
4、對資源的各種操作不會改變資源標識;
5、所有的操作都是無狀態的(stateless)。需要注意的是,REST是設計風格而不是標準。
RESTFul支持更為靈活,你不需要使用REST模式,只需要把控制器繼承Think\Controller\RestController即可。繼承RestController控制器后你的訪問控制器就可以支持下面的一些功能:
-
- 支持資源類型自動檢測;
- 支持請求類型自動檢測;
- RESTFul方法支持;
- 可以設置允許的請求類型列表;
- ? ? ? 可以設置允許請求和輸出的資源類型;
- ? ? ? 可以設置默認請求類型和默認資源類型;?
namespace Home\Controller;
use Think\Controller\RpcController;
class ServerController extends RpcController{
protected $allowMethodList = array('test1','test2');
public function test1(){
return 'test1';
}
public function test2(){
return 'test2';
}
public function test3(){
return 'test3';
}
}
?