【小(xiǎo)編推薦】ThinkPHP3.2——SAE

2014-06-26   | ​λ;  發布者:梁國(guó)芳  &n•↕↔​bsp;|   查看(kàn):33£↕£÷20次

Thinkphp

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à)特性:

大(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ú):

  1. $upload->rootPath =  './Public/';
  2. $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à)代碼:

  1. php
  2.  return array(
  3.     'TMPL_PARSE_STRING'=>array(
  4.       π££   '/Public/upload' => $st->getUrl('public','upload'),
  5.     )
  6.  );

這(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)₽π:

  1. handle:
  2. - 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))