ThinkPHP的SAE开发相关注意事项详解
本文详细讲述了thinkphp的sae开发相关注意事项。分享给大家供大家参考,具体如下:
thinkphp的sae开发和标准版本的thinkphp基本一样,你无需了解sae的接口用法,thinkphp的sae引擎已经自动为你整合了sae的接口,只要掌握thinkphp开发,你就能轻松掌握基于thinkphp的sae开发。
下面是我们给出的一些利用sae引擎开发过程的一些注意事项,能够帮助你更好的完成sae的开发和部署。
配置
sae引擎运行时拥有sae自己的惯例配置和专有配置,因此配置文件加载顺序为:
惯例配置->项目配置->sae惯例配置->sae专有配置
sae惯例配置和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引擎会自动判断处理):
缓存方法 | 本地运行 | sae平台 |
s缓存 | 默认使用file方式实现 | 固定使用memcache实现,所以在sae下 data_cache_type配置项将失效。你如果需要使用sae提供的mecache服务,直接使用s函数就可以 |
f缓存 | 使用file实现 | 使用kvdb实现 |
静态缓存 | 生成静态html文件 | 静态文件存入kvdb中 |
sql队列 | 支持file、xcache和apc方式 | 使用kvdb存储 |
新版的thinkphp支持sql缓存队列功能,我们可以配置db_sql_build_cache 开启sql语句解析缓存。在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上会把 /public/upload 替换为storage的地址, 在sae上图片也能正常显示。
文件删除问题:
因为上传的文件在本地和sae存放的地方不一样,所以我们不能直接用unlink删除文件。sae版thinkphp新增sae_unlink函数实现兼容。如:
sae_unlink('./public/uploads/xxx.jpg');
在本地运行时,会删除public/uploads文件夹下的图片。而在sae上运行时,会删除domain为public的storage中的图片。此函数会删除哪个domian的文件也是由路径的第一个目录名称决定的。
图片处理
sae引擎在图片处理方面也做了自动处理,在本地和sae平台的区别如下:
图片功能 | 本地运行 | sae平台 |
缩略图 | 调用image类库处理 | 自动使用saeimage服务 |
验证码 | 调用image类库处理 | 自动使用saevcode服务 |
你完全不用去学习怎么用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相关内容感兴趣的读者可查看本站专题:《thinkphp入门教程》、《thinkphp模板操作技巧总结》、《thinkphp常用方法总结》、《smarty模板入门基础教程》及《php模板技术总结》。
希望本文所述对大家基于thinkphp框架的php程序设计有所帮助。