能够在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不支持.htaccess | Cake的/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(用sae自定义的memcache初始化方法,替代Cake中的相关代码。来到/cake/libs/cache/memcache.php的L81。添加如下代码:
'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'));
$this->__Memcache = memcache_init();将.htaccess的rewrite规则,改写为 SAE支持的语法,并添加到config.yaml文件中。
return true;
name: <appName>在Cake库文件中搜索ini_get,找到相关代码3处,(在/cake/dispatcher.php和/cake/libs/router.php两个文件中),将其全部注释掉。找到的代码均跟下面的判断有关。
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}"
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本身经过一些定制即可支持此功能,网上有三篇文章提出了完整的配置方法:
- http://gamephase.net/posts/view/master-slave-datasource-behavior-cakephp
- http://bakery.cakephp.org/articles/gman.php/2009/01/20/master-slave-support-also-with-multiple-slave-support
- http://bakery.cakephp.org/articles/eagerterrier/2007/05/26/load-balancing-and-mysql-master-and-slaves-2
三种方法都不完美,在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服务 |
转载于:https://blog.51cto.com/liyongjiang/1181199