• 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方法,具体工作由ThinkLogDriverSae类完成。

    在本地运行会将日志记录到项目的项目的Runtime/Logs文件夹下,而在SAE上运行会将日志记录到SAE平台的日志中心: http://sae.sina.com.cn/?m=applog

    请在搜索框选择中的下拉菜单处选择“debug”进行查看。

    文件上传

    文件上传仍然使用ThinkUpload扩展类库上传文件,使用方法不变。同样的代码在本地运行时将会上传到指定的目录,在SAE上运行时就会自动使用Storage服务,将文件上传到指定的Storage中。

    首先你需要在SAE平台上创建一个Storage的domain用于存放上传的文件: http://sae.sina.com.cn/?m=storage

    这里可以建立多个domain。而我们的文件会上传到哪个domain,是由上传路径的第一个目录名称决定的。如:

    1. $upload->rootPath =  './Public/';
    2. $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文件中定义如下代码:

    1. <?php
    2.  return array(
    3.     'TMPL_PARSE_STRING'=>array(
    4.          '/Public/upload' => $st->getUrl('public','upload'),
    5.     )
    6.  );

    这样,在SAE上会把 /Public/upload 替换为storage的地址, 在SAE上图片也能正常显示。

    隐藏index.php

    SAE不支持.htaccess文件,但我们可以使用SAE提供的AppConfig服务实现伪静态。

    在你项目的根目录建立config.yaml文件,代码为:

    1. handle:
    2. - 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惯例配置文件已经内置处理了)

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/furuihua/p/11851099.html
Copyright © 2020-2023  润新知