一、数据库链接
<?php
$con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS) or die("数据库连接错误");
mysql_select_db("app_hamshun", $con);
mysql_query('set names utf8');
$insertSql = "INSERT INTO Demo (Title) VALUES ('7777')";
mysql_query($insertSql);php
?>html
二、文件读写
SAE采用分布式架构设计, 应用代码将部署在多台前端服务器上, 每次访问请求可能到达不一样服务器。(以下图):
假设如今有A、B、C、D四台服务器。用户上传一张图片到A服务器,第二次访问请求可能到达B服务器,此时将没法获取保存在A服务器上的图片。
SAE使用MemcacheX、
Storage等存储型服务代替传统IO操做,效率比传统IO读写操做高,有效解决因IO瓶颈致使程序性能低下的问题。
另外,不少网站被攻击都是由于服务器有写的权限,程序代码能被黑客修改,SAE禁止写操做,也提高了服务器的安全性。
SAE虽然禁止了IO写操做,可是并无禁止fwrite,file_put_contents等写操做函数,同时SAE还提供了
Wrappers服务,这使得移植程序也比较简单。 假设咱们要将下面的代码移植到SAE上。
file_put_contents('test.php','');
include 'test.php';
?>
只须要给文件地址加上前缀就能够了
file_put_contents('saemc://test.php','');
include 'saemc://test.php';
?>
注意:
1,在使用Wappers前,须要先初始化相应的服务。
另外
Mysql和
KVDB也是须要先初始化才能使用,若是程序有用到这些服务,请先初始化。
尤为是一些程序代码片断的缓存。如上面的例子,若是使用如 include 'saestor://xxx' 的代码来实现会使得程序性能较低。
开发者能够利用SAE的错误提示,快速的定位到程序须要修改的代码。
而后将程序上传到SAE。若是有不兼容的地方,错误提示会告诉你具体文件的具体行。
若是出现相似这样的提示:
SAE_Warning: file_put_contents(./xxx.php) [function.file-put-contents]: failed to open stream: Permission denied in xxx.php on line 2
说明程序正在进行IO写操做, 只需给地址加上
Wrappers的前缀,就能实现兼容。
若是你的程序的封装性好,更改IO写操做的代码, 每每很简单。好比ThinkPHP定义了RUNTIME_PATH常量。全部IO写操做产生的文件都会存放在 RUNTIME_PATH常量指定的文件夹中, 移植ThinkPHP程序, 只须要更改RUNTIME_PATH常量,加上saemc:// 前缀就能够了。其实其余框架或封装性比较好的程序,也是如此,只需更改一行代码,就能兼容IO写操做。若是你是从新用ThinkPHP开发程序的话,建议 使用SAE版ThinkPHP。
注:使用
Wrappers后,有些操做是无效的。 好比file_exists ,你们能够直接将这样的函数注释掉。
若是出现相似下面的提示:
SAE_Warning: mysql_connect() [function.mysql-connect]: this app is not authorised in xxx.php on line 2
导入数据库后,还要将原程序中数据库用户名、密码等更改成SAE的。 SAE的数据库用户名、密码、数据库名使用常量表示。能够在
mysql服务管理处看到。SAE的
Mysql数据库支持分布式,能链接两个数据库。若是你的原程序只支持单数据库操做,请链接主库域名。
当你的程序在SAE上没有出现错误提示了,你的程序已经初步能在SAE上面运行了。你还要检查一下一些细节的功能是否实现。好比上传图片功能等。建议将上传的图片或其余附件存放在
Storage中。图片存储在
Storage中后, 图片的访问地址也和之前不同。你须要使用
Storage的getUrl方法得到图片访问地址,如:
$s=new SaeStorage();
$url=$s->getUrl('domain','filepath');//得到图片地址,filepath为图片在
storage中的路径
?>
接下来,开发者能够对程序进行进一步的优化,让程序达到更好的性能。
咱们提供了一些优化的建议。
(2)将上传的图片或附件存储在
Storage中。若是你的图片须要防盗链等功能, 你还能够在SAE的服务管理后台,经过设置domain的属性能轻松的实现防盗链。
SAE
MySQL数据库主库可读写,从库只读。查询使用从库消耗的云豆更少,且响应更快,因此建议你们尽可能实现主从分离。如今不少框架,程序都支持读写分离,只需简单配置便可。若是程序只支持单数据库 能够尝试在执行SQL时进行判断若是是Select则连从库。
SAE提供了不少高效的服务,建议程序能使用SAE服务的地方尽可能使用SAE服务。好比程序有排行榜的功能, 可使用
Rank服务实现;验证码的功能, 可使用SaeVCode服务;发送邮件的功能, 可使用
Mail服务等等。请你们查看各个服务相关的文档进行学习。
有些程序有生成纯静态html的机制。你们可使用
KVDB存储html静态页面数据,因为SAE禁止IO写操做,不能实现真正的纯静态,咱们能够用伪静态的方式到达一样的效果,下面举一个简单的例子。
假设程序在未移植以前经过如下代码生成html文件:
file_put_contents('html/index.html', 'htmlcontent');
?>
这样用户经过浏览器输入地址 http://你的域名/html/index.html 访问到的是一个纯静态页面。
如今咱们要将程序移植到SAE上。
file_put_contents('saekv://html/index.html', 'htmlcontent');
?>
使用config.yaml, 写一条伪静态语句
- rewrite: if (path ~ "/html/(.*)") goto "/readhtml.php?path=html/$1"
若是用户访问了html目录会伪静态到readhtml.php文件进行读取静态数据。
readhtml.php的代码为:
echo file_get_contents('saekv://'.$_GET['path']);
?>
这样,在SAE上用户也能经过浏览器输入地址 http://你的域名/html/index.html 访问到数据。
有些程序有日志记录功能, 若是日志读写太频繁,不适合将日志文件存入
storage中,建议使用sae_debug实现日志记录。 可是sae_debug记录日志的同时也会向浏览器输出日志内容。不少程序但愿能现实暗地记录日志, 你们能够经过封装函数实现。
如:
function sae_log($msg){
sae_set_display_errors(false);//关闭信息输出
sae_debug($msg);//记录日志
sae_set_display_errors(true);//记录日志后再打开信息输出,不然会阻止正常的错误信息的显示
}
?>
经过sae_debug函数记录的日志能够在应用管理后台中的“日志中心”查看,它属于debug类型的日志, 你们须要在搜索框中下拉菜单中选择debug类型进行查看。
SAE每个应用能建立多个版本,可是这多个版本共用同一个
Memcache,
KVDB等 服务,有时候容易出现缓存共享问题。好比一个应用建立了两个版本,放有相同的程序, 程序有模版缓存机制,可能会出现,只修改了版本1的模板,却发现版本2的内容也被修改了。咱们要避免不一样版本之间缓存名称相同的现象。开发者可使 用$_SERVER['HTTP_APPVERSION']变量给缓存名称加上应用的版本号
Memcache缓存由于有消失的可能, 因此在读取
Memcache缓存时应该要判断缓存是否存在,若是不存在从新生成缓存,不然的
Memcache缓存一旦被删除而程序又没有更新缓存的机制,将可能致使网站不能正常访问。开发者能够在程序移植完成后在应用的Memcahe服务管理后台手动清空
Memcache缓存,再测试一下网站是否能正常运行。 建议将不须要更新机制的缓存使用
KVDB存储。
$s=new SaeStorage();
$domain=rtrim($s->getUrl('domain',''),'/');//注意getUrl的第二个参数为空
?>
并非全部文件地址前加上
Wrappers相应的前缀都能实现兼容。 好比如下代码:
$img=imagecreatefrompng("http://sae.sina.com.cn/static/image/logo.beta.new.png");
//…通过了一些列的图片处理函数处理…
imagepng($img,'saestor://upload/logo.png');//想经过
Wrappers保存处理后的图片
?>
开发者可使用临时文件解决上面的问题。
$img=imagecreatefrompng("http://sae.sina.com.cn/static/image/logo.beta.new.png");
//…通过了一些列的图片处理函数处理…
imagepng($img,SAE_TMP_PATH.'logo.png');//保存为临时文件
file_put_contents('saestor://upload/logo.png', file_get_contents(SAE_TMP_PATH.'logo.png'));
?>
通常的文件操做函数都是支持
Wrappers的,如file_put_contents,fwrite,file_get_contents,include,file_exists, filemtime,move_uploaded_file等等。 只有个别带特殊功能的函数不支持
Wrappers。
出于平台安全性考虑,SAE禁用了一些函数了类,详情查看
请使用功能相同的其余函数代替禁用的函数,如可用SimpleXML代替DoMDocument实现XML解析。
开发者能够将移植好的程序提交到SAE的应用仓库, 这样别人能够经过应用仓库一键安装就能快速得到你的程序。
建议你们在移植程序的时候写一篇“移植记录”。提交应用时一并将移植记录提交给咱们。这样方便咱们审核你的应用。
移植记录须要写清楚移植程序时哪些地方作了修改,使用了什么SAE服务等。
转自于http://blog.sina.com.cn/s/blog_73b89cd30101230u.html