本文詳細講述了ThinkPHP的SAE開發相關注意事項。分享給大家供大家參考,具體如下:
ThinkPHP的SAE開發和標準版本的ThinkPHP基本上一樣,你無需了解SAE的接口用法,ThinkPHP的SAE引擎已經自動為你整合了SAE的接口,只要掌握ThinkPHP開發,你就能輕鬆掌握基於ThinkPHP的SAE開發。
下面是我們給出的一些利用SAE引擎開發流程的一些注意事項,能夠幫助你更好的完成SAE的開發和部署。
配置
SAE引擎運行時擁有SAE自己的慣例配置和專有配置,因此配置文件加載順序為:
慣例配置->項目配置->SAE慣例配置->SAE專有配置
SAEAE配置和SAE專有配置中的配置項目將會覆寫專案配置。
SAE慣例配置:位於 引擎目錄/Sae/Conf/convention_sae.php,其中定義了程式在SAE上執行時固定的資料庫連線配置項目。
SAE專有設定:位於專案的Conf目錄下,檔案名稱為config_sae.php,大家可以將針對SAE的設定寫到其中。
註:SAE慣例配置和SAE專有配置是針對SAE環境的獨特配置,在本地運行時將不會載入。
資料庫
開發者不需要在專案設定檔(config.php)中定義和SAE相關的資料庫設定項,只需要定義本地偵錯時連接的資料庫即可。當程式碼提交到SAE時無需修改任何配置項目也能運行,因為SAE慣例配置會自動覆蓋你的專案設定檔中的資料庫配置。
程式碼在SAE上運作時會進行分散式資料庫連接,並讀寫分離。
快取
在SAE開發過程中,你仍然可以使用ThinkPHP內建的快取方法來處理。以下是SAE引擎使用不同的快取方法在本地和SAE平台下的差異(注意這個差異SAE引擎會自動判斷處理):
新版的ThinkPHP支援SQL快取佇列功能,我們可以設定DB_SQL_BUILD_CACHE 開啟語句解析快取。在SAE平台下固定使用KVDB儲存SQL緩存,因此DB_SQL_BUILD_QUEUE配置項目將無法運作。並且在SAE下運行時會用Counter服務記錄SQL緩存列隊出隊次數,在Counter的管理後台
http://sae.sina.com.cn/?m=counter
如果你看到計算器名稱為think_queue_out_times 的數值很大,表示你設定的佇列個數太小,需要調整DB_SQL_BUILD_LENGTH 配置項目。
文件上傳
文件上傳仍然使用UploadFile擴充類別庫上傳文件,使用方法不變。同樣的程式碼在本機執行時將會上傳到指定的目錄,在SAE上執行時就會自動使用Storage服務,將檔案上傳到指定的Storage。首先你需要在SAE平台上建立一個Storage的domain用來存放上傳的檔案:
http://sae.sina.com.cn/?m=storage
這裡可以建立多個domain。而我們的檔案會上傳到哪個domain,是由上傳路徑的第一個目錄名稱決定的。如:
$upload->savePath = './Public/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'=>sae_storage_root('Public').'/upload' ) );
這樣,在SAE上會替換為正常/upload 為storage的位址, 在SAE上圖片也能正常顯示。
檔案刪除問題:
因為上傳的檔案在本地和SAE存放的地方不一樣,所以我們無法直接用unlink刪除檔案。 SAE版ThinkPHP新增sae_unlink函數實作相容。如:
sae_unlink('./Public/Uploads/xxx.jpg');
在本地運行時,會刪除Public/Uploads資料夾下的圖片。而在SAE上執行時,會刪除domain為Public的Storage中的圖片。此函數會刪除哪個domian的檔案也是由路徑的第一個目錄名稱決定的。
圖片處理
SAE引擎在圖片處理方面也做了自動處理,在本地和SAE平台的區別如下:
你完全不用去学习怎么用SaeImage生成缩略图,也不用学习SaeVcode服务怎么用,你还是按照以前的方式使用ThinkPHP进行验证码和缩略图功能就可以了。
使用验证码的时候需要注意,在本地运行时验证码默认为数字形式,而在SAE上运行时验证码为数字+字母形式,而且存在字母大小写问题。如果你希望验证码区分大小写的话,需要将验证码统一转化为大写后进行匹配。
如:
if(md5(strtoupper($_POST['verify']))!=$_SESSION['verify']){ //验证错误处理代码 }
日志记录
SAE版ThinkPHP同样实现了生成系统日志功能,在本地运行会将日志记录到项目的项目的Runtime/Logs文件夹下,而在SAE上运行会将日志记录到SAE平台的日志中心:
http://sae.sina.com.cn/?m=applog
请在搜索框选择中的下拉菜单处选择“debug”进行查看。
Trace信息
建议在开发程序时配置SHOW_PAGE_TRACE=>true 开启页面Trace信息。开启后,代码在SAE环境下运行时会显示一些SAE独有的Trace信息,有助于我们开发。你可能会到以下trace信息。
模板缓存:Trace信息名称为“[SAE]模板缓存”
在SAE下不会将模板编译缓存生成在Runtime目录下,而是存放在Memcache中。如果你想查看模板编译后的缓存,这里显示的就是模板缓存在Memcache中的缓存名称。你可以在SAE的memcache服务管理平台输入缓存名称得到缓存内容:
http://sae.sina.com.cn/?m=mcmng
注:你看得的缓存内容,都是以一串数字开始,这数字和缓存内容无关,是记录的缓存生成时间。
核心缓存:Trace信息名称为“[SAE]核心缓存”
它记录的是核心编译缓存在Memcache中的缓存名称。如果你要获得核心编译缓存,比如我们要用核心编译缓存代替入口文件的时候。你可以在SAE的Memcache服务管理平台 输入这里记录的缓存名称获得。
注:
在开启调试时不会生成核心编译缓存,如果你获得核心编译缓存,请先关闭调试。
缓存内容开头的数字是记录的缓存生成时间,请将数字去掉后再作为入口文件。
静态缓存:Trace信息名称为“[SAE]静态缓存”
它记录了生成的静态缓存在KVDB中的名称。 目前SAE管理平台没有能直接输入KVDB名称获得内容的地方,大家需要自己写程序获取内容。
注:此Trace信息是在生成静态缓存的时候才会出现。如果你访问到的页面没有执行生成静态缓存的操作时,将不会有此条Trace信息。
隐藏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访问。
代码横跨性建议
SAE版ThinkPHP,是具有横跨性的,请不要破坏它的横跨性。比如,不要在项目配置文件中写和SAE数据库相关配置项。 自己写代码时,也要尽量做到横跨性,这样就可以让同样的代码既能在SAE下运行,也能在普通环境下运行, 使你在本地调试完后上传到SAE也不用修改任何代码就能运行。
下面是一些保持代码横跨性的建议:
(1)尽量少使用原生的SAE服务
能使用ThinkPHP自带函数替代的,尽量使用ThinkPHP自带函数。比如要使用SAE的KVDB服务,在ThinkPHP中完全可以用F函数代替。如果要使用SAE的Memcache服务,都使用S函数实现。 这样就不会导致你的代码从SAE转移到普通环境后性能很低。
个别SAE服务无法使用ThinkPHP自带函数代替的,才考虑使用原生的SAE服务。
(2)利用IS_SAE常量
ThinkPHP的SAE引擎增加了IS_SAE常量,能判断代码运行环境是普通环境还是SAE环境。如果你有段代码在普通环境和在SAE环境下实现方式不同,你可以使用IS_SAE进行判断后做不同处理或者加载不同的文件。
(3)利用SAE专有文件
在SAE惯例配置中,我们可以看见除了配置了固定的数据库配置项,还有一个SAE_SPECIALIZED_FILES配置项,它定义了系统专有文件。目前已经定义了UploadFile类和Image类的SAE专有文件,所以当我们的代码 import(“@.ORG.UploadFile”) 在本地运行时会按普通方式导入项目下Lib/ORG/UploadFile.class.php文件, 而在SAE上运行是系统检查到UploadFile.class.php有SAE专有文件,它导入的是SAE_SPECIALIZED_FILES配置项中定义的文件地址。这样实现了普通环境和SAE环境下同样的代码导入了不同类库,而类的调用方法都是一样的,只是现实方法不同,这样就能保证了代码的横跨性。
你也可以自己建立SAE專有文件,你可以將專有文件放在和普通文件同級目錄,這樣不用定義SAE_SPECIALIZED_FILE配置項,系統也能識別專有文件。例如我們在Image.class.php的文件的同級目錄如果定義了一個名為Image_sae.class.php 的文件,則系統SAE上運行時,導入Image.class.php檔案時會改為導入Image_sae.class .php文件。
如果一個類別庫既定義了同級目錄下的專有文件,也在SAE_SPECIALIZED_FILE配置項目中有定義,則會優先導入同級目錄下的專有文件。建議大家如果需要建立專有文件時,在普通文件同級目錄下建立。
如果導入的類別庫沒有SAE專有文件,在SAE下運行時也會導入普通文件。
我們可以利用SAE專有文件,針對普通環境和SAE環境封裝不同的類別庫,但類別庫的使用方法都是相同的,從而讓類別庫的客戶端程式碼具有橫跨性。
(4)利用SAE專有配置
當遇到SAE和普通環境配置需要不一樣時,你可以把普通環境的配置寫到專案設定檔Conf/config.php中,而將SAE需要用的配置寫入到SAE專有設定Conf/config_sae.php中。
希望本文所述對大家以ThinkPHP框架為基礎的PHP程式設計有所幫助。
更多ThinkPHP的SAE開發相關注意事項詳解相關文章請關注PHP中文網!