## 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慣例配置文件已經內置處理了)
- 序言
- 基礎
- 獲取ThinkPHP
- 環境要求
- 目錄結構
- 入口文件
- 自動生成
- 模塊
- 控制器
- 開發規范
- 配置
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 擴展配置
- 批量配置
- 架構
- 模塊化設計
- URL模式
- 多層MVC
- CBD模式
- 命名空間
- 自動加載
- 應用模式
- 項目編譯
- 系統流程
- 路由
- 路由定義
- 規則路由
- 正則路由
- 靜態路由
- 閉包支持
- 實例說明
- 控制器
- 控制器定義
- 前置和后置操作
- Action參數綁定
- 偽靜態
- URL大小寫
- URL生成
- AJAX返回
- 跳轉和重定向
- 輸入變量
- 請求類型
- 空操作
- 空控制器
- 插件控制器
- 操作綁定到類
- 模型
- 模型定義
- 模型實例化
- 字段定義
- 連接數據庫
- 切換數據庫
- 分布式數據庫支持
- 連貫操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- USING
- fetchSql
- TOKEN
- STRICT
- INDEX
- 命名范圍
- CURD操作
- 數據創建
- 數據寫入
- 數據讀取
- 數據更新
- 數據刪除
- ActiveRecord
- 字段映射
- 查詢語言
- 查詢方式
- 表達式查詢
- 快捷查詢
- 區間查詢
- 組合查詢
- 統計查詢
- SQL查詢
- 動態查詢
- 子查詢
- 自動驗證
- 自動完成
- 參數綁定
- 虛擬模型
- 模型分層
- 視圖模型
- 關聯模型
- 高級模型
- Mongo模型
- 視圖
- 模板定義
- 模板主題
- 模板賦值
- 模板渲染
- 獲取模板地址
- 獲取內容
- 模板引擎
- 模板
- 變量輸出
- 系統變量
- 使用函數
- 默認值輸出
- 使用運算符
- 標簽庫
- 模板繼承
- 修改定界符
- 三元運算
- 包含文件
- 內置標簽
- Volist標簽
- Foreach標簽
- For標簽
- Switch標簽
- 比較標簽
- 范圍判斷標簽
- IF標簽
- Present標簽
- Empty標簽
- Defined標簽
- Assign標簽
- Define標簽
- 標簽嵌套
- import標簽
- 使用PHP代碼
- 原樣輸出
- 模板注釋
- 模板布局
- 模板替換
- 調試
- 調試模式
- 異常處理
- 日志記錄
- 頁面Trace
- Trace方法
- 變量調試
- 性能調試
- 錯誤調試
- 模型調試
- 緩存
- 數據緩存
- 快速緩存
- 查詢緩存
- 靜態緩存
- 安全
- 輸入過濾
- 表單合法性檢測
- 表單令牌
- 防止SQL注入
- 目錄安全文件
- 保護模板文件
- 上傳安全
- 防止XSS攻擊
- 其他安全建議
- 擴展
- 類庫擴展
- 驅動擴展
- 緩存驅動
- 數據庫驅動
- 日志驅動
- Session驅動
- 存儲驅動
- 模板引擎驅動
- 標簽庫驅動
- 行為擴展
- 標簽擴展
- Widget擴展
- 應用模式
- 部署
- PATH_INFO支持
- URL重寫
- 模塊部署
- 域名部署
- 入口綁定
- 替換入口
- 專題
- SESSION支持
- Cookie支持
- 多語言支持
- 數據分頁
- 文件上傳
- 驗證碼
- 圖像處理
- RESTFul
- RPC
- SAE
- IP獲取和定位
- 附錄
- 常量參考
- 配置參考
- 升級指導
- 鳴謝