扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
不太清楚你是想问什么?
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:申请域名、网络空间、营销软件、网站建设、殷都网站维护、网站推广。
如果是要上传PHP代码,在你的管理应用,然后代码管理,就可以直接上传代码了
如果你是想导入mysql数据库中的数据,那在sae新建一个数据库,然后使用它的phpadmin,把你本地的sql直接导入就行,将来在你的数据库配置文件中,要把那些配置项使用sae提供的常量,这些你百度下,都会有的
?php
// 连主库
$link=mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
// 连从库
// $link=mysql_connect(SAE_MYSQL_HOST_S.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
if($link)
{
mysql_select_db(SAE_MYSQL_DB,$link);
//your code goes here
}
//创建一个数据库表
function _create_table($sql){
mysql_query($sql) or die('创建表失败,错误信息:'.mysql_error());
return "创建表成功";
}
//插入数据
function _insert_data($sql){
if(!mysql_query($sql)){
return 0; //插入数据失败
}else{
if(mysql_affected_rows()0){
return 1; //插入成功
}else{
return 2; //没有行受到影响
}
}
}
//删除数据
function _delete_data($sql){
if(!mysql_query($sql)){
return 0; //删除失败
}else{
if(mysql_affected_rows()0){
return 1; //删除成功
}else{
return 2; //没有行受到影响
}
}
}
//修改数据
function _update_data($sql){
if(!mysql_query($sql)){
return 0; //更新数据失败
}else{
if(mysql_affected_rows()0){
return 1; //更新成功;
}else{
return 2; //没有行受到影响
}
}
}
function _select_data($sql){
$ret = mysql_query($sql) or die('SQL语句有错误,错误信息:'.mysql_error());
return $ret;
}
function _drop_table($sql){
mysql_query($sql) or die('删除表失败,错误信息:'.mysql_error());
return "删除表成功";
}
?
首次听说SAE是在丛磊大牛在两年多前的一次小范围讲座中,但是真正开始使用SAE则是在2013年9月。当时自己的个人网站使用的还是传统的虚拟主机服务,运营商的不作为和服务器的频繁抽风导致我的小站几乎无法访问。忍无可忍的我再次想到了SAE。说起来自己也是学计算机的学生,应该沿着IT发展趋势以实际行动拥抱云计算。但是SAE毕竟不是虚拟主机,而是PaaS服务。这里简单写一篇短文,介绍一下自己的用PHP开发网站迁移到SAE的经历过程中总结的一些小经验。
以文章或类文章内容为主的网站,或者说CMS,通常的架构是PHP处理程序+MySQL数据库+前端模板。PHP处理程序对数据库进行读写操作,并将处理后的数据套用前端模板呈现给Web用户。但是这类程序部署或迁移到SAE时会主要遇到两个问题,一是存储空间的域名和程序空间的不同,二是程序空间不可写。这就使得以前直接生成静态页面的程序无法直接使用了,也会使得在程序空间生成缓存数据的程序无法直接使用了。怎么解决这些问题呢?
一、生成静态页面?
由于程序空间不可写,生成静态页面只能将页面创建到KVDB、MemCache(以下简称MC)和Storage中。但是前两者是不能被Web用户直接访问的,而Storage空间的域名和主域名不同,直接将页面跳转到Storage空间无疑对Web用户不太友好。因此,需要结合URL重写功能和PHP程序来完成这一任务。
1、PHP程序+Storage存储
简单来说,就是Web用户访问一个URL,但是该URL并不存在,通过URL重写转移到某个PHP程序,比如show.php吧,然后将URL中的path作为参数传递给show.php。show.php以该path到Storage中找到相应的静态页面,然后加载该文件并显示出来。但是这里用header功能跳转到该页面是没有意义的,URL将又转到Storage空间的域名了。因此,需要使用Storage服务的read方法,将文件读取出来,再在show.php中显示出来。
需要说明的是,Storage的流出是要计费的,而show.php读取后再以HTTP方式在用户的浏览器中显示出来还是需要计费的,个人猜想这样做会造成网站内容部分的双重计费(个人猜测未经证实,请大家指正)。而MySQL、KVDB和MC是按照请求数量计费的。考虑到Storage的流出计费是150云豆/GB,而另外三种中最贵的MySQL的请求计费是150云豆/百万次,因此,当平均每次请求的流量(1G/100万),即约1.05KB时,使用MySQL就更便宜的了。然而,现在网页的源文件动不动就超过1KB了,所以不一定非得生成静态。同时,生成静态后的网页也不便于更新或更改风格。
2、PHP程序+KVDB或MC
和前面的类似,无非就是将生成的静态页面以值的形式存储在KVDB或MC中。这种存储和Storage相比,计费的方式发生了变化,是按照请求次数计费的。KVDB是50云豆/百万次,MC是25云豆/百万次。但是需要注意的是,MC的存储费用相当昂贵,是200云豆/GB•天,而KVDB、MySQL和Storage的存储费用都是5云豆/GB•天。因此,当网站内容稍微多一点点的时候,使用KVDB要比MC更合适。
MySQL和KVDB的计费相比,MySQL的请求费用是KVDB的3倍。但是使用MySQL不需要生成静态页面,使用KVDB时相当于读取MySQL后生成的静态页面存储在KVDB中,多占用了一份存储空间(别告诉我说准备将数据只存储在KVDB中,真要是SAE的KVDB再瘫痪一次,那网站就麻烦大了)。
因此,我的网站在实现方式上,首页和列表页等频繁访问的页面中通过MySQL查询的结果存储在KVDB中,减少对数据库的查询请求操作。而其他页面不再缓存,直接从数据库中读取,这样做可以更好的更新页面中的访问量等动态信息。如果考虑进行进一步优化,可以统计页面的访问量,将访问量较大的页面存储到KVDB中。反正现在PHP的CPU时间是不计费的,多增加几个条件判断语句也没啥^_^
二、缓存
接下来讨论缓存的问题。网站中经常会有一些数据需要运行时加载而不是直接写到程序代码里,这样可以便于在网站后台直接进行设置而不是每次都修改程序代码文件。典型的,比如网站栏目列表、页面显示的一些配置、网站的一些全局配置等。这些配置虽然存储在MySQL中,但是通常还是生成缓存文件在运行时加载。这里使用KVDB和MC都可以。KVDB每次请求贵但是存储很廉价。MC每次请求便宜一半但是存储则为40倍。具体怎么选择看用户了。这里需要说明的是,既然按照请求次数计费而不是按照流量计费,那么最合适的优化方法是将全站所有页面都通用的数据存储到一个缓存中,这样就极大程度减少了因为请求数量造成的计费。
三、模板
模板文件应该放到什么地方呢?因为程序空间不能写,而KVDB和MC不能直接由用户上传和修改,因此要想通过网站后台方便地修改模板,还是应该将模板文件放到Storage中。我的做法是,将模板文件放到Storage中,需要修改时,在网站后台的编辑器中修改,或者在本地修改后使用Cyberduck上传。否则,每次修改模板都得重新部署代码实在是太麻烦了。
模板直接放到Storage中也不便使用,因为读取Storage要比读取KVDB/MC要慢。特别是模板这种每个页面都会用到的文件,还是应该以缓存的方式使用。我的做法是,将模板文件放在Storage中,然后读取它,将其中的一些模板标记改为相应的PHP代码,存储到KVDB中。
但是,这种嵌入了PHP代码的“编译”后的模板怎样执行呢?KVDB提供的get方法只能得到值,因为这些值不全都是PHP代码,毕竟还有html的标签,不能被evel。所以,需要使用KVDB的wrapper,以include的方式加载它。PHP中的include是可以有返回值的,可以据此判断是否成功地加载了缓存。如果不成功,可以重新生成缓存再加载。如果重新生成还不成功,为了网站的正常运行,可以从Storage中加载模板原文件再进行处理。这样可以保证即使部分服务出现故障时网站依然可以最大程度保持正常访问。
综上,我的网站迁移到SAE后的实现思路就是:
1、频繁访问的页面存入KVDB,不频繁访问的页面只存储在数据库,页面均动态生成,用AppConfig实现伪静态。
2、通用缓存尽可能存储到一个KVDB或MC的键值中。
3、模板源文件放到Storage中,模板标签预处理为PHP代码后缓存到KVDB或MC中
4、通过include加载缓存,并在include返回异常时重新生成缓存并加载,如果重新生成缓存的过程发生异常则不再使用缓存而直接输出。
我的个人网站已迁移到SAE中,除去上次SAE故障导致KVDB出现异常之外,一直稳定运行。欢迎大家围观和留言。由于使用SAE也不过半年,才疏学浅。文中的错误还请大家批评指正。
你可以把php代码放到sae空间去,运行就行,但SAE 的php和mysql 环境某些功能不能使用,但不影响绝大部分程序的运行。
?php
//初始话mysql连接
$mysql = new SaeMysql();
$sql = "SELECT * FROM `user` LIMIT 10";
//执行sql
$data = $mysql-getData( $sql );
//获取name参数,并过滤掉html xml php标记
$name = strip_tags( $_REQUEST['name'] );
//age参数格式化为整型
$age = intval( $_REQUEST['age'] );
//构造插入语句
$sql = "INSERT INTO `user` ( `name` , `age` , `regtime` ) VALUES ( '" . $mysql-escape( $name ) . "' , '" . intval( $age ) . "' , NOW() ) ";
//执行插入语句
$mysql-runSql( $sql );
//判断执行是否成功
if( $mysql-errno() != 0 )
{
die( "Error:" . $mysql-errmsg() );
}
//关闭数据库连接
$mysql-closeDb();
?
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流