thinkphp SAE
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
请在搜索框选择中的下拉菜单处选择“debug”进行查看。
文件上传
文件上传仍然使用Think\Upload
扩展类库上传文件,使用方法不变。同样的代码在本地运行时将会上传到指定的目录,在SAE上运行时就会自动使用Storage服务,将文件上传到指定的Storage中。
首先你需要在SAE平台上创建一个Storage的domain用于存放上传的文件: 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 SAE的更多相关文章
- thinkphp 3+ 观后详解 (2)
接上一章的内容,我们继续来看Think.class.php文件的start方法 static public function start() { // 注册AUTOLOAD方法 spl_autoloa ...
- 在 SAE 上部署 ThinkPHP 5.0 RC4
缘起 SAE 和其他的平台有些不同,不能在服务器上运行 Composer 来安装各种包,必须把源码都提交上去.一般的做法,可能是直接把源码的所有文件复制到目录中,添加到版本库.不过,这样就失去了与上游 ...
- sae中thinkphp使用smarty
因为最近在学thinkphp跟着做一个小商城. 没有使用thinkphp自带的think引擎,使用的是smarty引擎. 在sea中使用的时候出现了问题.已经是前几天的事了,问题图片没保存下来. 在网 ...
- ThinkPHP - 2 - SAE(新浪云)部署
ThinkPHP3.2核心内置了对SAE平台的支持(采用了应用模式的方式),具有自己的独创特性,能够最大程度的使用ThinkPHP的标准特性,让开发人员感受不到SAE和普通环境的差别.甚至可以不学习任 ...
- 新浪SAE使用Thinkphp框架,禁用memcache节省豆子的方法
请在入口文件定义常量,SAE_RUNTIME为true请在本地打开命令行, cd 到项目所在文件夹,执行命令: php index.php 此时会在./App/Sae_Runtime目录下批量生成缓存 ...
- thinkphp的学习笔记
# Thinkphp ## 什么是框架?(框架开发)> 框架就是通过提供一个开发Web程序的基本框架(比如提供了分页类.数据库操作类.文件操作类等),使用框架可以减少开发者代码的编写.> ...
- ThinkPHP升级指导
升级指导 http://www.kancloud.cn/manual/thinkphp5/163239 从V5.0.1升级到V5.0.2 从V5.0.1升级到V5.0.2需要注意如下事项: 下列模型属 ...
- 把php上传sae问题要使用IO
应用移植指南 一,为什么要移植应用 SAE禁止IO写操作,代码目录不能写入.这意味着普通程序的上传图片.生成缓存等操作都不能在SAE上正常运行,这时候你需要对这些代码进行修改后才能让你的程序运行在SA ...
- SAE云平台上传图片和发送邮件
1.远程图片保存至Storage 其中public是Storage中的容器名,"目录1/目录2/"是容器下的路径 $file_content 是得到的文件数据 $s = new S ...
随机推荐
- zookeeper问题排查
一.无法启动 zookeeper之前可以很好的运行,由于zk集群不是正常的关闭,比如 强制Linux关闭,直接执行kill 命令zk的进程等原因导致zookeeper启动不了 启动命令后,查看状态,会 ...
- Vue学习笔记【32】——Vue路由(watch、computed和methods之间的对比)
computed属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.主要当作属性来使用: methods方法表示一个具体的操作,主要书写业务逻辑: watch一个对象,键是需要观察的表达式,值是 ...
- table 中 当前行变量的获取
- Mybatis基于XML配置SQL映射器(三)
Mybatis之动态SQL mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: if choo ...
- 洛谷 P2441 角色属性树
题目描述 绪萌同人社是一个有趣的组织,该组织结构是一个树形结构.有一个社长,直接下属一些副社长.每个副社长又直接下属一些部长……. 每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素乘积构成(例 ...
- 如何在html中添加引用公共模块文件
1.首先需要修改apache的配置文件: 打开httpd.conf 搜索“AddType text/html .shtml” 搜索结果: AddType text/html .shtml .html ...
- 【Flutter学习】组件通信(父子、兄弟)
一,概述 flutter一个重要的特性就是组件化.组件分为两种状态,一种是StatefulWidget有状态组件,一种是StatelessWidget无状态组件. 无状态组件不能更新状态,有状态组件具 ...
- (转)使用OpenGL显示图像(五)添加移动
添加移动 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/motion.html 转:http://hukai. ...
- 一.jenkins安装(windows环境)
前提:jdk等已安装 jenkins下载地址:https://jenkins.io/download/ 以我目前的知识记录两种启动方式: 1.直接下载war包 通过 java -jar jenki ...
- 关于IDEA的一些问题
关于IDEA的一些问题 快速创建SpringBoot项目传送门:参考网址 创建Maven Web项目(带有webapp文件夹目录的项目)传送门:参考网址