## SAE介紹
Sina App Engine(簡稱**SAE**)是新浪研發中心開發的國內首個公有云計算平臺,是新浪云計算戰略的核心組成部分,作為一個簡單高效的分布式Web服務開發、運行平臺越來越受開發者青睞。
SAE環境和普通環境有所不同,它是一個分布式服務器集群,能讓你的程序同時運行在多臺服務器中。并提供了很多高效的分布式服務。SAE為了提升性能和安全,禁止了本地IO寫操作,使用MemcacheX、Storage等存儲型服務代替傳統IO操作,效率比傳統IO讀寫操作高,有效解決因IO瓶頸導致程序性能低下的問題。
> 正是因為SAE和普通環境的不同,使得普通程序不能直接放在SAE上,需要經過移植才能放在SAE上運行。也使得很多能在SAE上運行的程序不能在普通環境下運行。
ThinkPHP3.2核心內置了對SAE平臺的支持(采用了應用模式的方式),具有自己的獨創特性,能夠最大程度的使用ThinkPHP的標準特性,讓開發人員感受不到SAE和普通環境的差別。甚至可以不學習任何SAE知識,只要會ThinkPHP開發,就能將你的程序運行在SAE上。
SAE版ThinkPHP具有以下特性:
- 橫跨性:能讓同樣的代碼既能在SAE環境下運行,也能在普通環境下運行。解決了使用SAE不能在本地調試代碼的問題。
- 平滑性:我們還是按照以前一樣使用ThinkPHP,但是您已經不知不覺的使用了SAE服務,不用特意學習SAE服務,降低學習成本。比如你不用特意的去學習KVDB服務,你在SAE環境下使用ThinkPHP的F函數就已經使用了KVDB的服務。
- 完整性:SAE開發下面功能沒有任何刪減,支持ThinkPHP標準模式的所有功能。
> 大多SAE移植程序都是使用Wrappers實現,SAE版ThinkPHP沒有使用Wrappers,使用SAE的原始服務接口,運行效率比用Wrappers更高。
3.2版本中你無需考慮SAE平臺的部署,在本地采用標準模式開發完成后,直接部署到SAE平臺后,系統會自動轉換為SAE模式運行。
> 在本地開發完成后,上傳到SAE平臺需要做一些初始化工作,例如初始化Mysql,Memcache,KVDB服務。 SAE平臺不支持IO寫操作,所以你不能在SAE上首次運行入口文件生成項目目錄。你可以在本地運行入口文件,本地生成好項目目錄后再提交到SAE上。
> 注意:如果要部署到SAE平臺的話,你的應用代碼不要直接進行文件讀寫操作,而采用ThinkPHP封裝的方法或者函數進行操作即可。
## SAE配置
SAE引擎運行時擁有SAE自己的慣例配置和專有配置,因此配置文件加載順序為:
### 慣例配置->項目配置->SAE慣例配置->SAE專有配置
> SAE慣例配置和SAE專有配置中的配置項將會覆蓋項目配置。
**SAE慣例配置**:位于系統目錄的 /Mode/Sae/convention.php,其中定義了程序在SAE上運行時固定的數據庫連接配置項。
**SAE專有配置**:位于應用的公共Conf目錄下,文件名為config_sae.php,大家可以將針對SAE的配置寫到其中。
> 注:SAE慣例配置和SAE專有配置是針對SAE環境的獨有配置,在本地運行時將不會加載。
## 數據庫
開發者不需要在應用配置文件(config.php)中定義和SAE相關的數據庫配置項,只需要定義本地調試時連接的數據庫即可。代碼提交到SAE時無需修改任何配置項也能運行,因為SAE慣例配置會自動覆蓋你的項目配置文件中的數據庫配置。
> 代碼在SAE上運行時會進行分布式數據庫連接,并讀寫分離。
## 緩存
在SAE開發過程中,你仍然可以使用ThinkPHP內置的緩存方法進行處理。下面是SAE引擎使用不同的緩存方法在本地和SAE平臺下的區別(注意這個區別SAE引擎會自動判斷處理):
| 緩存方法 | 本地運行 | SAE平臺 |
|-----|-----|-----|
| S緩存 | 默認使用File方式實現 | 固定使用Memcache實現 |
| F緩存 | 使用File實現 | 使用KVDB實現 |
| 靜態緩存 | 生成靜態Html文件 | 靜態文件存入KVDB中 |
| SQL隊列 | 支持File、Xcache和APC方式 | 使用KVDB存儲 |
## 日志
你無需單獨為SAE平臺寫日志功能,一切都是框架的Log類自動處理的。ThinkPHP在SAE平臺的日志寫入是調用了**sae_debug**方法,具體工作由`Think\Log\Driver\Sae`類完成。
在本地運行會將日志記錄到項目的項目的`Runtime/Logs`文件夾下,而在SAE上運行會將日志記錄到SAE平臺的日志中心: [http://sae.sina.com.cn/?m=applog](http://sae.sina.com.cn/?m=applog)
請在搜索框選擇中的下拉菜單處選擇“debug”進行查看。
## 文件上傳
文件上傳仍然使用`Think\Upload`擴展類庫上傳文件,使用方法不變。同樣的代碼在本地運行時將會上傳到指定的目錄,在SAE上運行時就會自動使用**Storage**服務,將文件上傳到指定的Storage中。
首先你需要在SAE平臺上創建一個Storage的domain用于存放上傳的文件: [http://sae.sina.com.cn/?m=storage](http://sae.sina.com.cn/?m=storage)
這里可以建立多個domain。而我們的文件會上傳到哪個domain,是由上傳路徑的第一個目錄名稱決定的。如:
~~~
$upload->rootPath = './Public/';
$upload->savePath = 'Uploads/';
~~~
會上傳到**名為Public的domain**。
> 你也不用在這個domain下創建Uploads文件夾,SAE的Storage服務會為你自動創建。
圖片地址的問題: 我們使用UploadFile類上傳圖片,在本地和在SAE下圖片的瀏覽地址是不一樣的。比如有張圖片地址為 "/Public/upload/1.jpg" , /Public 是一個模板替換變量, 他會被替換為Public文件夾所在目錄的地址, 我們可以通過瀏覽器的查看源代碼功能查看被替換后是什么效果。 可以看見, 替換后為 "/Public/upload/1.jpg" 。 但是在SAE上圖片并沒有在Public/upload目錄下,而是在storage中。我們需要將 /Public/替換為storage的域名,在SAE上才能正常顯示。
我們在SAE專有配置`Conf/config_sae.php`文件中定義如下代碼:
~~~
<?php
return array(
'TMPL_PARSE_STRING'=>array(
'/Public/upload' => $st->getUrl('public','upload'),
)
);
~~~
這樣,在SAE上會把 `/Public/upload`**替換為storage的地址**, 在SAE上圖片也能正常顯示。
## 隱藏index.php
SAE不支持`.htaccess`文件,但我們可以使用SAE提供的**AppConfig**服務實現偽靜態。
在你項目的根目錄建立`config.yaml`文件,代碼為:
~~~
handle:
- rewrite: if(!is_dir() && !is_file() && path~"^(.*)$") goto "index.php/$1"
~~~
這樣就可以隱藏入口了。
比如這樣的地址 `http://serverName/index.php/Blog/read/id/1`也能通過 `http://serverName/Blog/read/id/1`訪問。
## 代碼橫跨性建議
ThinkPHP的SAE模式,是具有橫跨性的,請不要破壞它的橫跨性。比如,不要在項目配置文件中寫和SAE數據庫相關配置項。自己寫代碼時,也要盡量做到橫跨性,這樣就可以讓同樣的代碼既能在SAE下運行,也能在普通環境下運行,使你在本地調試完后上傳到SAE也不用修改任何代碼就能運行。
**下面是一些保持代碼橫跨性的建議:**
(1)盡量少使用原生的SAE服務
能使用ThinkPHP自帶函數替代的,盡量使用ThinkPHP自帶函數。比如要使用SAE的KVDB服務,在ThinkPHP中完全可以用F函數代替。如果要使用SAE的Memcache服務,都使用S函數實現。這樣就不會導致你的代碼從SAE轉移到普通環境后性能很低。個別SAE服務無法使用ThinkPHP自帶函數代替的,才考慮使用原生的SAE服務。
(2)利用SAE專有配置
當遇到SAE和普通環境配置需要不一樣時,你可以把普通環境的配置寫到項目配置文件Conf/config.php中,而將SAE需要用的配置寫到SAE專有配置Conf/config_sae.php中。(大多數差異化的配置,SAE慣例配置文件已經內置處理了)
- 序
- 前言
- 內容簡介
- 目錄
- 基礎知識
- 起步
- 控制器
- 模型
- 模板
- 命名空間
- 進階知識
- 路由
- 配置
- 緩存
- 權限
- 擴展
- 國際化
- 安全
- 單元測試
- 拿來主義
- 調試方法
- 調試的步驟
- 調試工具
- 顯示trace信息
- 開啟調試和關閉調試的區別
- netbeans+xdebug
- Socketlog
- PHP常見錯誤
- 小黃鴨調試法,每個程序員都要知道的
- 應用場景
- 第三方登錄
- 圖片處理
- 博客
- SAE
- REST實踐
- Cli
- ajax分頁
- barcode條形碼
- excel
- 發郵件
- 漢字轉全拼和首字母,支持帶聲調
- 中文分詞
- 瀏覽器useragent解析
- freelog項目實戰
- 需求分析
- 數據庫設計
- 編碼實踐
- 前端實現
- rest接口
- 文章發布
- 文件上傳
- 視頻播放
- 音樂播放
- 圖片幻燈片展示
- 注冊和登錄
- 個人資料更新
- 第三方登錄的使用
- 后臺
- 微信的開發
- 首頁及個人主頁
- 列表
- 歸檔
- 搜索
- 分頁
- 總結經驗
- 自我提升
- 進行小項目的鍛煉
- 對現有輪子的重構和移植
- 寫技術博客
- 制作視頻教程
- 學習PHP的知識和新特性
- 和同行直接溝通、交流
- 學好英語,走向國際
- 如何參與
- 瀏覽官網和極思維還有看云
- 回答ThinkPHP新手的問題
- 嘗試發現ThinkPHP的bug,告訴官方人員或者push request
- 開發能提高效率的ThinkPHP工具
- 嘗試翻譯官方文檔
- 幫新手入門
- 創造基于ThinkPHP的產品,進行連帶推廣
- 展望未來
- OneThink
- ThinkPHP4
- 附錄