SAE介紹
Sina App Engine(簡稱SAE)是(shì)新浪研發中心開(kāi)發的(de)國(guó)內(nèi)首γ個(gè)公有(yǒu)雲計(jì)算(suàn)平台,是(shì)新浪雲≤™∞π計(jì)算(suàn)戰略的(de)核心組成↑>部分(fēn),作(zuò)為(wèi)一(yī)個(gè)∑>簡單高(gāo)效的(de)分(fēn)布式Web服務開(kāi)發、運行>∏λ<(xíng)平台越來(lái)越受開(kāi)發>♠♠€者青睐。
SAE環境和(hé)普通(tōng)環境有(yǒ☆π¶♥u)所不(bù)同,它是(shì)一(y✔↔ī)個(gè)分(fēn)布式服務器(qì)集群,能(néng×≠)讓你(nǐ)的(de)程序同時(shí)運行(xíng)在多(duō↑Ω×)台服務器(qì)中。并提供了(le)很(hěn)多(duō)σ↕高(gāo)效的(de)分(fēn)布式服務。SAE為≤(wèi)了(le)提升性 能(néng)和(hé)安全,禁止了(le)本地(∏• ∏dì)IO寫操作(zuò),使用(yòng)MemcacheX、Storageα 等存儲型服務代替傳統IO操作(zuò),效率比傳統I≤♣O讀(dú)寫操作(zuò)高(gāo)÷×,有(yǒu)效解決因IO瓶頸 導緻程序性能(nénו₩g)低(dī)下(xià)的(de)問(w>↓"èn)題。
正是(shì)因為(wèi)SAE和(hé)普通★β≥(tōng)環境的(de)不(bù)同,使得©₹★✔(de)普通(tōng)程序不(bù)能(néng)直接放(<₩≤fàng)在SAE上(shàng),需要(yào)經過移→™≈ 植才能(néng)放(fàng)在SAE上(shàng)運行(xíng)。也α"π≥(yě)使得(de)很(hěn)多(duō)能(néng)在•☆☆<SAE上(shàng)運行(xíng)的(de)程序不(b±€♥φù)能(néng)在普通(tōng)環境下'∞(xià)運行(xíng)。
ThinkPHP3.2核心內(nèi)置§♦∑'了(le)對(duì)SAE平台的(de)支持(采☆↑用(yòng)了(le)應用(yòng)&&÷模式的(de)方式),具有(yǒu)自(zì)己的∏↕γ(de)獨創特性,能(néng)夠最大(dà)程度的(de)使用(yòng)←∞→ThinkPHP的(de)标準特 性,讓開λε(kāi)發人(rén)員(yuán)感§£受不(bù)到(dào)SAE和(hé)普通(tōng) ↓≥環境的(de)差别。甚至可(kě)以不(bù)學習(xí)任何SAE知(zh✘✔♦ī)識,隻要(yào)會(huì)ThinkPHP開(k ±$āi)發,就(jiù)能(néng)将你(nǐ)的(de)程↕↓₹序運行(xíng)在SAE上(shàng)。
SAE版ThinkPHP具有(yǒu)以下(xià)特性:
- 橫跨性:能(néng)讓同樣的(de)代碼既能(néng)∏₹在SAE環境下(xià)運行(xíng),也(yě)能(n≠✔£éng)在普通(tōng)環境下(xià)運行(xíng)。解決了(le)∑¥使用(yòng)SAE不(bù)能(néng)在Ω↓"本地(dì)調試代碼的(de)問(wèn)題。
- 平滑性:我們還(hái)是(shì)按照( ©£zhào)以前一(yī)樣使用(yòng)ThinkPHP,但( £→dàn)是(shì)您已經不(bù)知(zhī)不(bù)覺的(de)★ >使用(yòng)了(le)SAE服務,不(×↓bù)用(yòng)特意學習(xí)SAE服務,降低(d™<←ī)學習(xí)成本。比如(rú)你(nǐ♥★σ)不(bù)用(yòng)特意的(de)去(qù)學習(xí)KVDB服務,你♣÷✔(nǐ)在SAE環境下(xià)使用(y<φ òng)ThinkPHP的(de)F函數(shù≈δ)就(jiù)已經使用(yòng)了(le)↓§ KVDB的(de)服務。
- 完整性:SAE開(kāi)發下(xià)面功能(néng)沒有(yǒ₩×u)任何删減,支持ThinkPHP标準模式的(de)所有(•≈yǒu)功能(néng)。
大(dà)多(duō)SAE移植程序都(dōu)是(shì)使用(yò$∞ng)Wrappers實現(xiàn),SAE版ThinkPHP←×€沒有(yǒu)使用(yòng)Wrapp§→±ers,使用(yòng)SAE的(de)原始服→≠務接口,運行(xíng)效率比用(yòng)Wrappeφ©rs更高(gāo)。
3.2版本中你(nǐ)無需考慮SAE平台的(♠≈&₽de)部署,在本地(dì)采用(yòng)标準模式開(kāi)發完成後,β"± 直接部署到(dào)SAE平台後,系統會(huì)自(zì)動轉換為§↕< (wèi)SAE模式運行(xíng)。
在本地(dì)開(kāi)發完成後,上(shà∑∏ng)傳到(dào)SAE平台需要(yào)做(zuò)一(yī)些(xiē)★σ初始化(huà)工(gōng)作(zuò),例如(rú)初始化(huà)MΩ∏ysql,Memcache,KVDB服務。 SAE平台不(bù)支持IO♥±σ≠寫操作(zuò),所以你(nǐ)不(bù)★•∏能(néng)在SAE上(shàng)首次運行(xíng&♦π)入口文(wén)件(jiàn)生(shēng)成項目目錄。你(nπ₽ǐ)可(kě)以在本地(dì)運行(xíng)入口文(wén)件(jiàn),☆€本地(dì)生(shēng)成好(hǎo)項目目錄後再提交到(♥ dào)SAE上(shàng)。
注意:如(rú)果要(yào)部署到(dào)SAE平台的(d♥✔÷≠e)話(huà),你(nǐ)的(de)應用(yòn≤€ ☆g)代碼不(bù)要(yào)直接進行(xíng)文(wén)件(ji♦₽¶<àn)讀(dú)寫操作(zuò),而采用(yòng)ThinkPHP封裝的(©¶de)方法或者函數(shù)進行(xíng)操作(zuò)即可(kě)±←。
SAE配置
SAE引擎運行(xíng)時(shí)擁有(yǒu)SAE自(z←≈φ€ì)己的(de)慣例配置和(hé)專有(yǒu)配置→≥,因此配置文(wén)件(jiàn)加載順α>¶序為(wèi):
慣例配置->項目配置->SAE慣例配置->SA ™♠E專有(yǒu)配置
SAE慣例配置和(hé)SAE專有(yǒu)配置中的(<♦de)配置項将會(huì)覆蓋項目配置。•δ×
SAE慣例配置:位于系統目錄的(de) /Mode/Sae/conventi™↑on.php,其中定義了(le)程序在SAE上(shàng)運行(x'±←γíng)時(shí)固定的(de)數(shù)據庫連接配置項。 SAE專有(yǒu)配置:位于應用(yòng)的(de)公共Conf目錄下(xià),文(wén)件∑>♦(jiàn)名為(wèi)config_sae.php,大(dà)家(jiā)♠₩λ可(kě)以将針對(duì)SAE的(de≠₩÷Ω)配置寫到(dào)其中。
注:SAE慣例配置和(hé)SAE專有(yǒu)配置是(shì)針對(duΩ©ì)SAE環境的(de)獨有(yǒu)配置,在本₩★≥'地(dì)運行(xíng)時(shí)将不(bù)會(huì)加載。
數(shù)據庫
開(kāi)發者不(bù)需要(yào)在應用(yòng)配置文(wé ®λn)件(jiàn)(config.php)中定義和₽♣×(hé)SAE相(xiàng)關的(de)數(s≈÷hù)據庫配置項,隻需要(yào)定義本地(dì)調試時(shí)連接₩§的(de)數(shù)據庫即可(kě)。代碼提交到( ®dào)SAE時(shí)無需修改任何配置項也(yě)能(néng)♠≤α÷運行(xíng),因為(wèi)SAE慣例配置×✔會(huì)自(zì)動覆蓋你(nǐ)的(de)項目配置文(wén)→Ω件(jiàn)中的(de)數(shù)據庫配置。
代碼在SAE上(shàng)運行(xíng)時(shí)會(huì)Ω±進行(xíng)分(fēn)布式數(shù)據庫連接,Ωβ∏并讀(dú)寫分(fēn)離(lí)。
緩存
在SAE開(kāi)發過程中,你(nǐ)仍然可₩δ↕(kě)以使用(yòng)ThinkPHP內(λ≥¶nèi)置的(de)緩存方法進行(xíng)處理(§σlǐ)。下(xià)面是(shì)SAE引擎使用(yòng)不(bù)同的(d±♥Ωe)緩存方法在本地(dì)和(hé)SAE平台下(xià)的λ± (de)區(qū)别(注意這(zhè)個(gè)區(qδ$σ ū)别SAE引擎會(huì)自(zì)動判斷處理(lǐ)):
| 緩存方法 | 本地(dì)運行(xíng) | SAE平台 |
|---|---|---|
| S緩存 | 默認使用(yòng)File方式實現(xi<€àn) | 固定使用(yòng)Memcache實現(xiàn) |
| F緩存 | 使用(yòng)File實現(xiàn) | 使用(yòng)KVDB實現(xiàn) |
| 靜(jìng)态緩存 | 生(shēng)成靜(jìng)态Html文(wén)件(jiàn)≥± | 靜(jìng)态文(wén)件(jiàn)存入KVDB中 |
| SQL隊列 | 支持File、Xcache和(hé)APC方式 | 使用(yòng)KVDB存儲 |
日(rì)志(zhì)
你(nǐ)無需單獨為(wèi)SAE平台寫日(rì)志(zhì)功能(♣∑$₽néng),一(yī)切都(dōu)是(shì)框架的(de)Log類自(α♠$zì)動處理(lǐ)的(de)。ThinkPHP在SAE平台的( ♠ de)日(rì)志(zhì)寫入是(shì)調用(yòn✔>"g)了(le)sae_debug方法,具體(tǐ)工(gōng)作(zuò)由Think\Log\Driver\Sae類完成。
在本地(dì)運行(xíng)會(huì)将日($♣$>rì)志(zhì)記錄到(dào)項目的(de)項目的(de)Runtime/Logs文(wén)件(jiàn)夾下(xià),而在SAE上(shàng)運行(x∑αíng)會(huì)将日(rì)志(zhì)記錄到(dào)SAE平台的(d♥→e)日(rì)志(zhì)中心: http://sae.si♥φna.com.cn/?m=applog
請(qǐng)在搜索框選擇中的(de)下(xià)拉Ω♥菜單處選擇“debug&rdα₩♦quo;進行(xíng)查看(kàn)。
文(wén)件(jiàn)上(shàng)傳
文(wén)件(jiàn)上(shàng)傳仍然使用(yòng)Think\Upload擴展類庫上(shàng)傳文(wén)件(jiàn),使用(yò♦&∑ng)方法不(bù)變。同樣的(de)代碼在本地(φdì)運行(xíng)時(shí)将會(huì)上(shàng)傳γπ'×到(dào)指定的(de)目錄,在SAE上(shàng)運行(xíng)↑π↔★時(shí)就(jiù)會(huì)自(zì)動使用(©¥yòng)Storage服務,将文(wén)件(jiàn)上(shàng)傳到(dà®→<o)指定的(de)Storage中。
首先你(nǐ)需要(yào)在SAE平台上(shàng) ≥™創建一(yī)個(gè)Storage的(de)doma☆>↓in用(yòng)于存放(fàng)上(shàng)傳的(de) 文(wén)件(jiàn): http://sae.sina∑™.com.cn/?m=storage
這(zhè)裡(lǐ)可(kě)以建立多(duō)個(gè)domain。δ 而我們的(de)文(wén)件(jiàn)會(huì)↓∞≠上(shàng)傳到(dào)哪個(gè)domain,是(shì)由>↔↑₹上(shàng)傳路(lù)徑的(de)第一(yī)個(gè)目錄名β稱決定的(de)。如(rú):
$upload->rootPath = './Public/';$upload->savePath = 'Uploads/';
會(huì)上(shàng)傳到(dào)名為(wèi)Public的(de)domain。
你(nǐ)也(yě)不(bù)用(yòng)↑÷Ω€在這(zhè)個(gè)domain下(xià)創建Up♠∏loads文(wén)件(jiàn)夾,SAE的(de)SΩφ<torage服務會(huì)為(wèi)你(nǐ)"↑₽自(zì)動創建。
圖片地(dì)址的(de)問(wèn)題: 我們使用(yòn♣∞επg)UploadFile類上(shàng)傳圖片γγ≈α,在本地(dì)和(hé)在SAE下(xià)圖片的(de)浏覽地(₩↓dì)址是(shì)不(bù)一(yī)樣的(de)。$←λπ比如(rú)有(yǒu)張圖片地(dì)址為(wèi) ☆→ "/Public/upload/1.jpg" ≥≤, /Public 是(shì)一(yī)個(gè)模闆替換變量, 他φ↔★(tā)會(huì)被替換為(wèi)Pu ₽ blic文(wén)件(jiàn)夾所在目錄的(de)地(dì)址, ★™↑我們可(kě)以通(tōng)過浏覽器(qì)的(de)查看(k↕γàn)源代碼功能(néng)查看(kàn)被β 替換後是(shì)什(shén)麽效果。 可(kě)以看(kΩ àn)見(jiàn), 替換後為(wèi) "/Public/upl•≈oad/1.jpg" 。 但(dàn)是(shì)在SAE上(sh♣☆àng)圖片并沒有(yǒu)在Public/upload目錄下¥$£©(xià),而是(shì)在storage中。♣≠∏我們需要(yào)将 /Public/替換為(wèi)storage←>的(de)域名,在SAE上(shàng)才能(néng)λ±÷正常顯示。
我們在SAE專有(yǒu)配置Conf/config_sae.php文(wén)件(jiàn)中定義如(rú)下(xià)代碼:
phpreturn array('TMPL_PARSE_STRING'=>array(π££ '/Public/upload' => $st->getUrl('public','upload'),));
這(zhè)樣,在SAE上(shàng)σ≈©>會(huì)把 /Public/upload 替換為(wèi)storage的(de)地(dì)址, 在SAE上(shàng)圖片也(yě)能(néng)正常顯示Ω→♥。
隐藏index.php
SAE不(bù)支持.htaccess文(wén)件(jiàn),但(dàn)我們可(kě)以¥λ₽使用(yòng)SAE提供的(de)AppConfig服務實現(xiàn)僞靜(jìng)态。
在你(nǐ)項目的(de)根目錄建立config.yaml文(wén)件(jiàn),代碼為(wèi)₽π:
handle:- rewrite: if(!is_dir() && !is_file() && path~"^(.*)$") goto "index.php/$1"
這(zhè)樣就(jiù)可(kě)以隐藏入口了(l ≈e)。
比如(rú)這(zhè)樣的(de)地(dì∞"σ$)址 http://serverName/index.php/Blog/♣→£∏read/id/1也(yě)能(néng)通(tōng)過 http://serverName/Blo• g/read/id/1訪問(wèn)。
代碼橫跨性建議(yì)
ThinkPHP的(de)SAE模式,是(shì)具有(yǒu)橫跨♣£©性的(de),請(qǐng)不(bù)要(yào)破壞它的(de)↓≤橫跨性。比如(rú),不(bù)要(yào)™•¥在項目配置文(wén)件(jiàn)中寫和(hé)SAE數(shù)據£庫相(xiàng)關配置項。自(zì)己寫代碼時(shíδ≠≤),也(yě) 要(yào)盡量做(zuò)到σ↕<♥(dào)橫跨性,這(zhè)樣就(ji©₹ ♥ù)可(kě)以讓同樣的(de)代碼既能( ≥↑néng)在SAE下(xià)運行(xíng),≈α×也(yě)能(néng)在普通(tōng)環$ σ境下(xià)運行(xíng),使你(nǐ)在本地(dì)調試完後上(shàβ& ng)傳到(dào)SAE也(yě)不(bù)用(y φòng)修改任何代碼就(jiù)能(néng)運行(x∞©♠íng)。
下(xià)面是(shì)一(yī)些(xiē)保持代碼橫跨性的(deπ♥)建議(yì):
(1)盡量少(shǎo)使用(yòng)原 ≥>ε生(shēng)的(de)SAE服務
能(néng)使用(yòng)ThinkPHP自(zì)帶函數(sh ₹λ¶ù)替代的(de),盡量使用(yòng)T£₹♣hinkPHP自(zì)帶函數(shù)。比如(rú)要(yào ♥↕)使用(yòng)SAE的(de)KVDB服務,在✘₩εThinkPHP中完全可(kě)以用(yòng)F函 數±≈(shù)代替。如(rú)果要(yào)使用(yò✘×≠÷ng)SAE的(de)Memcache服務,都↑≤≈(dōu)使用(yòng)S函數(shù)實現(xiàn)。這Ω₹<∞(zhè)樣就(jiù)不(bù)會(huì)導緻你(nǐ)的(d•¶€e)代碼從(cóng)SAE轉移到(dào)普通(tōng)環境後 ♣性能(néng)很(hěn)低(dī)。個(gè)别SAE服務無法使用(yòn£<g) ThinkPHP自(zì)帶函數(shù)代π✔≤替的(de),才考慮使用(yòng)原生(shēn☆✘g)的(de)SAE服務。
(2)利用(yòng)SAE專有(yǒu)配置
當遇到(dào)SAE和(hé)普通(tōβ÷ng)環境配置需要(yào)不(bù)一(yγ≈ī)樣時(shí),你(nǐ)可(kě)以把普通(tōγ★ng)環境的(de)配置寫到(dào)項目配置文(♠ πwén)件(jiàn)Conf/config.p≤> hp中,而将SAE需要(yào)用(yòng)的(de)配置寫到©λ(dào)SAE專有(yǒu)配置Conf§Ω/config_sae.php中。(大(dà)多(duō)數(s≤₩"$hù)差異化(huà)的(de)配置,SAE慣例配置文(wén)件(jiàn)®↓ 已經內(nèi)置處理(lǐ)了(le))




