ThinkPHP的SAE開(kāi)發(fā)相關(guān)注意事項(xiàng)詳解
本文詳細(xì)講述了ThinkPHP的SAE開(kāi)發(fā)相關(guān)注意事項(xiàng)。分享給大家供大家參考,具體如下:
ThinkPHP的SAE開(kāi)發(fā)和標(biāo)準(zhǔn)版本的ThinkPHP基本一樣,你無(wú)需了解SAE的接口用法,ThinkPHP的SAE引擎已經(jīng)自動(dòng)為你整合了SAE的接口,只要掌握ThinkPHP開(kāi)發(fā),你就能輕松掌握基于ThinkPHP的SAE開(kāi)發(fā)。
下面是我們給出的一些利用SAE引擎開(kāi)發(fā)過(guò)程的一些注意事項(xiàng),能夠幫助你更好的完成SAE的開(kāi)發(fā)和部署。
配置
SAE引擎運(yùn)行時(shí)擁有SAE自己的慣例配置和專(zhuān)有配置,因此配置文件加載順序?yàn)椋?/p>
慣例配置->項(xiàng)目配置->SAE慣例配置->SAE專(zhuān)有配置
SAE慣例配置和SAE專(zhuān)有配置中的配置項(xiàng)將會(huì)覆蓋項(xiàng)目配置。
SAE慣例配置:位于 引擎目錄/Sae/Conf/convention_sae.php,其中定義了程序在SAE上運(yùn)行時(shí)固定的數(shù)據(jù)庫(kù)連接配置項(xiàng)。
SAE專(zhuān)有配置:位于項(xiàng)目的Conf目錄下,文件名為config_sae.php,大家可以將針對(duì)SAE的配置寫(xiě)到其中。
注:SAE慣例配置和SAE專(zhuān)有配置是針對(duì)SAE環(huán)境的獨(dú)有配置,在本地運(yùn)行時(shí)將不會(huì)加載。
數(shù)據(jù)庫(kù)
開(kāi)發(fā)者不需要在項(xiàng)目配置文件(config.php)中定義和SAE相關(guān)的數(shù)據(jù)庫(kù)配置項(xiàng),只需要定義本地調(diào)試時(shí)連接的數(shù)據(jù)庫(kù)即可。代碼提交到SAE時(shí)無(wú)需修改任何配置項(xiàng)也能運(yùn)行,因?yàn)镾AE慣例配置會(huì)自動(dòng)覆蓋你的項(xiàng)目配置文件中的數(shù)據(jù)庫(kù)配置。
代碼在SAE上運(yùn)行時(shí)會(huì)進(jìn)行分布式數(shù)據(jù)庫(kù)連接,并讀寫(xiě)分離。
緩存
在SAE開(kāi)發(fā)過(guò)程中,你仍然可以使用ThinkPHP內(nèi)置的緩存方法進(jìn)行處理。下面是SAE引擎使用不同的緩存方法在本地和SAE平臺(tái)下的區(qū)別(注意這個(gè)區(qū)別SAE引擎會(huì)自動(dòng)判斷處理):
| 緩存方法 | 本地運(yùn)行 | SAE平臺(tái) |
| S緩存 | 默認(rèn)使用File方式實(shí)現(xiàn) | 固定使用Memcache實(shí)現(xiàn),所以在SAE下 DATA_CACHE_TYPE配置項(xiàng)將失效。你如果需要使用SAE提供的Mecache服務(wù),直接使用S函數(shù)就可以 |
| F緩存 | 使用File實(shí)現(xiàn) | 使用KVDB實(shí)現(xiàn) |
| 靜態(tài)緩存 | 生成靜態(tài)Html文件 | 靜態(tài)文件存入KVDB中 |
| SQL隊(duì)列 | 支持File、Xcache和APC方式 | 使用KVDB存儲(chǔ) |
新版的ThinkPHP支持SQL緩存隊(duì)列功能,我們可以配置DB_SQL_BUILD_CACHE 開(kāi)啟SQL語(yǔ)句解析緩存。在SAE平臺(tái)下固定使用KVDB存儲(chǔ)SQL緩存,因此DB_SQL_BUILD_QUEUE配置項(xiàng)將不起作用。并且在SAE下運(yùn)行時(shí)會(huì)用Counter服務(wù)記錄SQL緩存列隊(duì)出隊(duì)次數(shù),在Counter的管理后臺(tái)
http://sae.sina.com.cn/?m=counter
如果你看到計(jì)算器名稱(chēng)為think_queue_out_times 的數(shù)值很大,說(shuō)明你設(shè)置的隊(duì)列個(gè)數(shù)太小,需要調(diào)整DB_SQL_BUILD_LENGTH 配置項(xiàng)。
文件上傳
文件上傳仍然使用UploadFile擴(kuò)展類(lèi)庫(kù)上傳文件,使用方法不變。同樣的代碼在本地運(yùn)行時(shí)將會(huì)上傳到指定的目錄,在SAE上運(yùn)行時(shí)就會(huì)自動(dòng)使用Storage服務(wù),將文件上傳到指定的Storage中。首先你需要在SAE平臺(tái)上創(chuàng)建一個(gè)Storage的domain用于存放上傳的文件:
http://sae.sina.com.cn/?m=storage
這里可以建立多個(gè)domain。而我們的文件會(huì)上傳到哪個(gè)domain,是由上傳路徑的第一個(gè)目錄名稱(chēng)決定的。如:
$upload->savePath = './Public/Uploads/';
會(huì)上傳到名為Public的domain。你也不用在這個(gè)domain下創(chuàng)建Uploads文件夾,SAE的Storage服務(wù)會(huì)為你自動(dòng)創(chuàng)建。
圖片地址的問(wèn)題:
我們使用UploadFile類(lèi)上傳圖片,在本地和在SAE下圖片的瀏覽地址是不一樣的。比如有張圖片地址為 "/Public/upload/1.jpg" , /Public 是一個(gè)模板替換變量, 他會(huì)被替換為Public文件夾所在目錄的地址, 我們可以通過(guò)瀏覽器的查看源代碼功能查看被替換后是什么效果。 可以看見(jiàn), 替換后為 "/Public/upload/1.jpg" 。 但是在SAE上圖片并沒(méi)有在Public/upload目錄下,而是在storage中。 我們需要將 /Public/替換為storage的域名,在SAE上才能正常顯示。
我們?cè)赟AE專(zhuān)有配置Conf/config_sae.php文件中 定義如下代碼:
<?php
return array(
'TMPL_PARSE_STRING'=>array(
'/Public/upload'=>sae_storage_root('Public').'/upload'
)
);
這樣,在SAE上會(huì)把 /Public/upload 替換為storage的地址, 在SAE上圖片也能正常顯示。
文件刪除問(wèn)題:
因?yàn)樯蟼鞯奈募诒镜睾蚐AE存放的地方不一樣,所以我們不能直接用unlink刪除文件。SAE版ThinkPHP新增sae_unlink函數(shù)實(shí)現(xiàn)兼容。如:
sae_unlink('./Public/Uploads/xxx.jpg');
在本地運(yùn)行時(shí),會(huì)刪除Public/Uploads文件夾下的圖片。而在SAE上運(yùn)行時(shí),會(huì)刪除domain為Public的Storage中的圖片。此函數(shù)會(huì)刪除哪個(gè)domian的文件也是由路徑的第一個(gè)目錄名稱(chēng)決定的。
圖片處理
SAE引擎在圖片處理方面也做了自動(dòng)處理,在本地和SAE平臺(tái)的區(qū)別如下:
| 圖片功能 | 本地運(yùn)行 | SAE平臺(tái) |
| 縮略圖 | 調(diào)用Image類(lèi)庫(kù)處理 | 自動(dòng)使用SaeImage服務(wù) |
| 驗(yàn)證碼 | 調(diào)用Image類(lèi)庫(kù)處理 | 自動(dòng)使用SaeVcode服務(wù) |
你完全不用去學(xué)習(xí)怎么用SaeImage生成縮略圖,也不用學(xué)習(xí)SaeVcode服務(wù)怎么用,你還是按照以前的方式使用ThinkPHP進(jìn)行驗(yàn)證碼和縮略圖功能就可以了。
使用驗(yàn)證碼的時(shí)候需要注意,在本地運(yùn)行時(shí)驗(yàn)證碼默認(rèn)為數(shù)字形式,而在SAE上運(yùn)行時(shí)驗(yàn)證碼為數(shù)字+字母形式,而且存在字母大小寫(xiě)問(wèn)題。如果你希望驗(yàn)證碼區(qū)分大小寫(xiě)的話(huà),需要將驗(yàn)證碼統(tǒng)一轉(zhuǎn)化為大寫(xiě)后進(jìn)行匹配。
如:
if(md5(strtoupper($_POST['verify']))!=$_SESSION['verify']){
//驗(yàn)證錯(cuò)誤處理代碼
}
日志記錄
SAE版ThinkPHP同樣實(shí)現(xiàn)了生成系統(tǒng)日志功能,在本地運(yùn)行會(huì)將日志記錄到項(xiàng)目的項(xiàng)目的Runtime/Logs文件夾下,而在SAE上運(yùn)行會(huì)將日志記錄到SAE平臺(tái)的日志中心:
http://sae.sina.com.cn/?m=applog
請(qǐng)?jiān)谒阉骺蜻x擇中的下拉菜單處選擇“debug”進(jìn)行查看。
Trace信息
建議在開(kāi)發(fā)程序時(shí)配置SHOW_PAGE_TRACE=>true 開(kāi)啟頁(yè)面Trace信息。開(kāi)啟后,代碼在SAE環(huán)境下運(yùn)行時(shí)會(huì)顯示一些SAE獨(dú)有的Trace信息,有助于我們開(kāi)發(fā)。你可能會(huì)到以下trace信息。
模板緩存:Trace信息名稱(chēng)為“[SAE]模板緩存”
在SAE下不會(huì)將模板編譯緩存生成在Runtime目錄下,而是存放在Memcache中。如果你想查看模板編譯后的緩存,這里顯示的就是模板緩存在Memcache中的緩存名稱(chēng)。你可以在SAE的memcache服務(wù)管理平臺(tái)輸入緩存名稱(chēng)得到緩存內(nèi)容:
http://sae.sina.com.cn/?m=mcmng
注:你看得的緩存內(nèi)容,都是以一串?dāng)?shù)字開(kāi)始,這數(shù)字和緩存內(nèi)容無(wú)關(guān),是記錄的緩存生成時(shí)間。
核心緩存:Trace信息名稱(chēng)為“[SAE]核心緩存”
它記錄的是核心編譯緩存在Memcache中的緩存名稱(chēng)。如果你要獲得核心編譯緩存,比如我們要用核心編譯緩存代替入口文件的時(shí)候。你可以在SAE的Memcache服務(wù)管理平臺(tái) 輸入這里記錄的緩存名稱(chēng)獲得。
注:
在開(kāi)啟調(diào)試時(shí)不會(huì)生成核心編譯緩存,如果你獲得核心編譯緩存,請(qǐng)先關(guān)閉調(diào)試。
緩存內(nèi)容開(kāi)頭的數(shù)字是記錄的緩存生成時(shí)間,請(qǐng)將數(shù)字去掉后再作為入口文件。
靜態(tài)緩存:Trace信息名稱(chēng)為“[SAE]靜態(tài)緩存”
它記錄了生成的靜態(tài)緩存在KVDB中的名稱(chēng)。 目前SAE管理平臺(tái)沒(méi)有能直接輸入KVDB名稱(chēng)獲得內(nèi)容的地方,大家需要自己寫(xiě)程序獲取內(nèi)容。
注:此Trace信息是在生成靜態(tài)緩存的時(shí)候才會(huì)出現(xiàn)。如果你訪(fǎng)問(wèn)到的頁(yè)面沒(méi)有執(zhí)行生成靜態(tài)緩存的操作時(shí),將不會(huì)有此條Trace信息。
隱藏index.php
SAE不支持.htaccess文件,但我們可以使用SAE提供的AppConfig服務(wù)實(shí)現(xiàn)偽靜態(tài)。
在你項(xiàng)目的根目錄建立config.yaml文件,代碼為:
handle: - rewrite: if(!is_dir() && !is_file() && path~"^(.*)$") goto "index.php/$1"
這樣就可以隱藏入口了。
比如這樣的地址 http://serverName/index.php/Blog/read/id/1也能通過(guò)
http://serverName/Blog/read/id/1訪(fǎng)問(wèn)。
代碼橫跨性建議
SAE版ThinkPHP,是具有橫跨性的,請(qǐng)不要破壞它的橫跨性。比如,不要在項(xiàng)目配置文件中寫(xiě)和SAE數(shù)據(jù)庫(kù)相關(guān)配置項(xiàng)。 自己寫(xiě)代碼時(shí),也要盡量做到橫跨性,這樣就可以讓同樣的代碼既能在SAE下運(yùn)行,也能在普通環(huán)境下運(yùn)行, 使你在本地調(diào)試完后上傳到SAE也不用修改任何代碼就能運(yùn)行。
下面是一些保持代碼橫跨性的建議:
(1)盡量少使用原生的SAE服務(wù)
能使用ThinkPHP自帶函數(shù)替代的,盡量使用ThinkPHP自帶函數(shù)。比如要使用SAE的KVDB服務(wù),在ThinkPHP中完全可以用F函數(shù)代替。如果要使用SAE的Memcache服務(wù),都使用S函數(shù)實(shí)現(xiàn)。 這樣就不會(huì)導(dǎo)致你的代碼從SAE轉(zhuǎn)移到普通環(huán)境后性能很低。
個(gè)別SAE服務(wù)無(wú)法使用ThinkPHP自帶函數(shù)代替的,才考慮使用原生的SAE服務(wù)。
(2)利用IS_SAE常量
ThinkPHP的SAE引擎增加了IS_SAE常量,能判斷代碼運(yùn)行環(huán)境是普通環(huán)境還是SAE環(huán)境。如果你有段代碼在普通環(huán)境和在SAE環(huán)境下實(shí)現(xiàn)方式不同,你可以使用IS_SAE進(jìn)行判斷后做不同處理或者加載不同的文件。
(3)利用SAE專(zhuān)有文件
在SAE慣例配置中,我們可以看見(jiàn)除了配置了固定的數(shù)據(jù)庫(kù)配置項(xiàng),還有一個(gè)SAE_SPECIALIZED_FILES配置項(xiàng),它定義了系統(tǒng)專(zhuān)有文件。目前已經(jīng)定義了UploadFile類(lèi)和Image類(lèi)的SAE專(zhuān)有文件,所以當(dāng)我們的代碼 import(“@.ORG.UploadFile”) 在本地運(yùn)行時(shí)會(huì)按普通方式導(dǎo)入項(xiàng)目下Lib/ORG/UploadFile.class.php文件, 而在SAE上運(yùn)行是系統(tǒng)檢查到UploadFile.class.php有SAE專(zhuān)有文件,它導(dǎo)入的是SAE_SPECIALIZED_FILES配置項(xiàng)中定義的文件地址。這樣實(shí)現(xiàn)了普通環(huán)境和SAE環(huán)境下同樣的代碼導(dǎo)入了不同類(lèi)庫(kù),而類(lèi)的調(diào)用方法都是一樣的,只是現(xiàn)實(shí)方法不同,這樣就能保證了代碼的橫跨性。
你也可以自己建立SAE專(zhuān)有文件,你可以將專(zhuān)有文件放在和普通文件同級(jí)目錄,這樣不用定義SAE_SPECIALIZED_FILE配置項(xiàng),系統(tǒng)也能識(shí)別專(zhuān)有文件。比如我們?cè)贗mage.class.php的文件的同級(jí)目錄如果定義了一個(gè)名為Image_sae.class.php 的文件,則系統(tǒng)SAE上運(yùn)行時(shí),導(dǎo)入Image.class.php文件時(shí)會(huì)改為導(dǎo)入Image_sae.class.php文件。
如果一個(gè)類(lèi)庫(kù)既定義了同級(jí)目錄下的專(zhuān)有文件,也在SAE_SPECIALIZED_FILE配置項(xiàng)中有定義,則會(huì)優(yōu)先導(dǎo)入同級(jí)目錄下的專(zhuān)有文件。建議大家如果需要建立專(zhuān)有文件時(shí),在普通文件同級(jí)目錄下建立。
如果導(dǎo)入的類(lèi)庫(kù)沒(méi)有SAE專(zhuān)有文件,在SAE下運(yùn)行時(shí)也會(huì)導(dǎo)入普通文件。
我們可以利用SAE專(zhuān)有文件,針對(duì)普通環(huán)境和SAE環(huán)境封裝不同的類(lèi)庫(kù),但類(lèi)庫(kù)的使用方法都是相同的,從而讓類(lèi)庫(kù)的客戶(hù)端代碼具有橫跨性。
(4)利用SAE專(zhuān)有配置
當(dāng)遇到SAE和普通環(huán)境配置需要不一樣時(shí),你可以把普通環(huán)境的配置寫(xiě)到項(xiàng)目配置文件Conf/config.php中,而 將SAE需要用的配置寫(xiě)到SAE專(zhuān)有配置Conf/config_sae.php中。
更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《ThinkPHP入門(mén)教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《smarty模板入門(mén)基礎(chǔ)教程》及《PHP模板技術(shù)總結(jié)》。
希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。
- 使用Thinkphp框架開(kāi)發(fā)移動(dòng)端接口
- ThinkPHP的MVC開(kāi)發(fā)機(jī)制實(shí)例解析
- 最新制作ThinkPHP3.2.3完全開(kāi)發(fā)手冊(cè)
- ThinkPHP3.1新特性之命名范圍的使用
- thinkphp的URL路由規(guī)則與配置實(shí)例
- thinkphp路由規(guī)則使用示例詳解和偽靜態(tài)功能實(shí)現(xiàn)(apache重寫(xiě))
- thinkPHP5.0框架安裝教程
- thinkPHP5.0框架應(yīng)用請(qǐng)求生命周期分析
- thinkPHP5.0框架URL訪(fǎng)問(wèn)方法詳解
- thinkPHP5.0框架命名空間詳解
- thinkPHP5.0框架自動(dòng)加載機(jī)制分析
- thinkPHP5.0框架配置格式、加載解析與讀取方法
- thinkPHP5.0框架獨(dú)立配置與動(dòng)態(tài)配置方法
- thinkPHP5.0框架環(huán)境變量配置方法
- thinkPHP5.0框架開(kāi)發(fā)規(guī)范簡(jiǎn)介
相關(guān)文章
PHP獲取遠(yuǎn)程http或ftp文件的md5值的方法
這篇文章主要介紹了PHP獲取遠(yuǎn)程http或ftp文件的md5值 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
PHP XML備份Mysql數(shù)據(jù)庫(kù)
以下是在Linux下通過(guò)Apache+PHP對(duì)Mysql數(shù)據(jù)庫(kù)的備份的文件代碼2009-05-05
PHP中將ip地址轉(zhuǎn)成十進(jìn)制數(shù)的兩種實(shí)用方法
現(xiàn)在PHP中有很多時(shí)候都會(huì)用到ip地址,但是這個(gè)ip地址獲取的時(shí)候都不是10進(jìn)制的。那么PHP中如何將ip地址轉(zhuǎn)成十進(jìn)制數(shù),下面為大家介紹下兩種方法可以輕松實(shí)現(xiàn)2013-08-08
函數(shù)中使用require_once問(wèn)題深入探討 優(yōu)雅的配置文件定義方法推薦
這篇文章主要介紹了函數(shù)中使用require_once問(wèn)題深入探討,優(yōu)雅的配置文件定義方法推薦,最終用一個(gè)靜態(tài)類(lèi)來(lái)定義配置文件獲勝,完美解決函數(shù)中使用require_once的問(wèn)題,需要的朋友可以參考下2014-07-07
Yii基于CActiveForm的Ajax數(shù)據(jù)驗(yàn)證用法示例
這篇文章主要介紹了Yii基于CActiveForm的Ajax數(shù)據(jù)驗(yàn)證用法,結(jié)合實(shí)例形式分析了Yii視圖自定義Form表單的ajax提交及控制器處理實(shí)現(xiàn)方法,需要的朋友可以參考下2016-07-07

