能够在Sina App Engine (SAE) 上运行的CakePHP(1.xx)

使用方法

覆盖项目文件到sae代码目录下

适用范围

  • 在CakePHP 1.3.6下开发测试
  • 应该可以用于1.2.0正式版之后的所有版本
  • 程序的webroot目录应该位于/app/webroot,否则需自行修改config.yaml中的redirect规则
  • 无法用于1.20 alpha及之前的版本

原生Cake为什么无法直接运行在SAE上

 

SAE限制原生Cake的做法
SAE的文件系统是不可写的Cake默认的缓存方式就是写文件到/app/tmp目录
SAE不支持.htaccessCake的/controller/action/params路径转向系统,依赖于.htaccess中的rewrite规则
SAE不允许ini_get()Cake核心库中,有三处ini_get()的调用

 

修改

针对上面的三个问题,需对Cake的相应文件进行如下修改

  • 开启Cake的Memcache缓存系统,替代File系统。SAE提供了Memcache服务(需在SAE管理面板中手动开启)。在/app/config/core.php的L290,取消注释memcache的部分,注释掉file部分。

 

Cache::config('default', array(
       
'engine' => 'Memcache', //[required]
       
'duration'=> 3600, //[optional]
       
'probability'=> 100, //[optional]
       
'prefix' => Inflector::slug(APP_DIR) . '_', //[optional]  prefix every cache file with this string
       
'servers' => array(
               
'127.0.0.1:11211' // localhost, default port 11211
       
), //[optional]
       
'compress' => false, // [optional] compress data in Memcache (slower, but uses less memory)
       
));

// Cache::config('default', array('engine' => 'File'));
用sae自定义的memcache初始化方法,替代Cake中的相关代码。来到/cake/libs/cache/memcache.php的L81。添加如下代码:
$this->__Memcache = memcache_init();
return true;
将.htaccess的rewrite规则,改写为 SAE支持的语法,并添加到config.yaml文件中。
name: <appName>
version
: 1
handle
:
 
- rewrite:if (!is_file() && !is_dir() && path ~ "^app/webroot/(.*)") goto "app/webroot/index.php?url=$1&%{QUERY_STRING}"
 
- rewrite:if (!is_file() && !is_dir() && path ~ "(.*)") goto "app/webroot/$1?%{QUERY_STRING}"
在Cake库文件中搜索ini_get,找到相关代码3处,(在/cake/dispatcher.php和/cake/libs/router.php两个文件中),将其全部注释掉。找到的代码均跟下面的判断有关。
if (ini_get('magic_quotes_gpc') === '1') {
}

数据库设置

在/app/config/database.php中,可参考下面的配置。注意__construct()函数是如何动态配置主机、端口和数据库名的。SAE推荐用动态的方式配置数据库主机、端口和数据库名,引用SAE预设的常量获得用户名/密码信息。

class DATABASE_CONFIG {
       
var $default = array(
               
'driver' => 'mysql',
               
'persistent' => false,
               
'host' => '',
               
'login' => SAE_ACCESSKEY,
               
'password' => SAE_SECRETKEY,
               
'database' => "",
               
'prefix' => '',
       
);
       
       
function __construct() {
                $this
->default["host"] = 'm'.$_SERVER['HTTP_MYSQLPORT'].'.mysql.sae.sina.com.cn:'.$_SERVER['HTTP_MYSQLPORT'];
                $this
->default["database"] = "app_".$_SERVER['HTTP_APPNAME'];
       
}
}

数据库主从分离(master and slave)

SAE还提供了MySQL数据库主从分离的功能。需要写操作的时候,访问master数据库;只需要读取信息时,访问slave数据库。Cake本身经过一些定制即可支持此功能,网上有三篇文章提出了完整的配置方法:

三种方法都不完美,在join的情况下或多或少都有问题,第一篇文章中介绍的方法比较好,推荐。您可以根据自己应用的需要进行定制。

 

已有应用迁移注意事项

如果您把已开发好的Cake应用迁移到SAE上,首先建议逐步安装,排除问题:

  • 更新Cake到最新版本(本文写作时,为1.3.6)
  • 建立一份干净的CakePHP安装,并在SAE下调试好
  • 把已有代码中app目录下的文件,拷贝到成功运行的Cake中

接下来还可能会遇到以下问题:

问题原因SAE上的解决方法
mkdir, fwrite等失败SAE的文件系统不可写使用数据库或Memcache存储数据
curl_exec失败SAE不允许对sina.com.cn之外的curl访问使用SAE提供的fetchUrl服务