sae php.ini,在 SAE 上运行 Laravel 4

本文由游子团队成员、DiliCMS 作者 chekun (a.k.a. @jeongee) 首发于 SAE 官方论坛,现经由游子团队整理校对并重新发布。

When Laravel meets SAE

相信大家或多或少已经了解过目前横扫 PHP 社区的 Laravel 框架了。在2012年以前,我主要使用 CodeIgniter 作为日常开发的核心框架;在了解过 Laravel 3 诸多耳目一新的特性和架构后,我立马被它的优雅、灵活所吸引,自此毅然成为 Laravel 开发者阵营中的一员。关于 Laravel 的各种高大上特性,我在这里不做详谈,感兴趣的可以到 Laravel 官网查看了解。

Sina App Engine(简称SAE)是新浪推出的 PaaS 公有云计算平台,目前 SAE 平台支持 PHP、Python 和 Java 编程语言。既然 SAE 支持 PHP 编程语言,那么,它理论上自然应该支持 Laravel。然而 SAE 云基础架构的一些限制导致我们无法直接、自由的使用原生 Laravel 框架:

本地文件读写:Laravel 通过读写本地文件的方式实现缓存和临时文件(如 manifest)的存取;而 SAE 不支持直接读写本地文件。

缓存类:Laravel 没有直接提供 SAE 可直接使用的缓存类。

Session类:Laravel 默认的 Session 机制并非采用 PHP 原生 Session 实现;而 SAE 则默认支持 PHP 原生 Session。具体来说:SAE 通过 session_start() 开启一个 Session 会话;而采用了 Symfony Session 的 Laravel,自然继承了其 Session 类会和 SAE 自动 session_start() 产生兼容性问题的特性。

模版引擎:Laravel Blade 模板引擎编译后的临时文件会存放于本地,故依然存在本地文件直接读写的 SAE 兼容性问题。

幸运的是,PHP5 的新特性和 Laravel 强大的扩展能力使得我们可以轻松解决上述问题。本文所附带的开源项目,可以让您的 Laravel 项目优雅的运行于 SAE 平台上。

改造本地项目使其支持 SAE 运行环境

接下来我会简要介绍本地项目的基本改造过程,从而使我们在不影响本地开发的情况下,做到本地开发和 SAE 线上运行环境的无痛切换。

1. 修改 app/config/app.php

$app = array(

'debug' => false,

'url' => 'http://www.dilicms.com',

'timezone' => 'PRC',

'locale' => 'zh-cn',

'key' => 'x1RYfs4ArTE12sz7879mdvse471epPAA',

'providers' => array(

'Illuminate\Foundation\Providers\ArtisanServiceProvider',

'Illuminate\Auth\AuthServiceProvider',

'Illuminate\Cache\CacheServiceProvider',

'Illuminate\Foundation\Providers\CommandCreatorServiceProvider',

'Illuminate\Session\CommandsServiceProvider',

'Illuminate\Filesystem\FilesystemServiceProvider',

'Illuminate\Foundation\Providers\ComposerServiceProvider',

'Illuminate\Routing\ControllerServiceProvider',

'Illuminate\Cookie\CookieServiceProvider',

'Illuminate\Database\DatabaseServiceProvider',

'Illuminate\Encryption\EncryptionServiceProvider',

'Illuminate\Filesystem\FilesystemServiceProvider',

'Illuminate\Hashing\HashServiceProvider',

'Illuminate\Html\HtmlServiceProvider',

'Illuminate\Foundation\Providers\KeyGeneratorServiceProvider',

'Illuminate\Log\LogServiceProvider',

'Illuminate\Mail\MailServiceProvider',

'Illuminate\Foundation\Providers\MaintenanceServiceProvider',

'Illuminate\Database\MigrationServiceProvider',

'Illuminate\Foundation\Providers\OptimizeServiceProvider',

'Illuminate\Pagination\PaginationServiceProvider',

'Illuminate\Foundation\Providers\PublisherServiceProvider',

'Illuminate\Queue\QueueServiceProvider',

'Illuminate\Redis\RedisServiceProvider',

'Illuminate\Auth\Reminders\ReminderServiceProvider',

'Illuminate\Foundation\Providers\RouteListServiceProvider',

'Illuminate\Database\SeedServiceProvider',

'Illuminate\Foundation\Providers\ServerServiceProvider',

'Illuminate\Session\SessionServiceProvider',

'Illuminate\Foundation\Providers\TinkerServiceProvider',

'Illuminate\Translation\TranslationServiceProvider',

'Illuminate\Validation\ValidationServiceProvider',

'Illuminate\View\ViewServiceProvider',

'Illuminate\Workbench\WorkbenchServiceProvider',

'Lavender\Cloud\Sina\Patcher\SaePatcherServiceProvider',

),

'manifest' => storage_path().'/meta',

'aliases' => array(

'App' => 'Illuminate\Support\Facades\App',

'Artisan' => 'Illuminate\Support\Facades\Artisan',

'Auth' => 'Illuminate\Support\Facades\Auth',

'Blade' => 'Illuminate\Support\Facades\Blade',

'Cache' => 'Illuminate\Support\Facades\Cache',

'ClassLoader' => 'Illuminate\Support\ClassLoader',

'Config' => 'Illuminate\Support\Facades\Config',

'Controller' => 'Illuminate\Routing\Controllers\Controller',

'Cookie' => 'Illuminate\Support\Facades\Cookie',

'Crypt' => 'Illuminate\Support\Facades\Crypt',

'DB' => 'Illuminate\Support\Facades\DB',

'Eloquent' => 'Illuminate\Database\Eloquent\Model',

'Event' => 'Illuminate\Support\Facades\Event',

'File' => 'Illuminate\Support\Facades\File',

'Form' => 'Illuminate\Support\Facades\Form',

'Hash' => 'Illuminate\Support\Facades\Hash',

'HTML' => 'Illuminate\Support\Facades\HTML',

'Input' => 'Illuminate\Support\Facades\Input',

'Lang' => 'Illuminate\Support\Facades\Lang',

'Log' => 'Illuminate\Support\Facades\Log',

'Mail' => 'Illuminate\Support\Facades\Mail',

'Paginator' => 'Illuminate\Support\Facades\Paginator',

'Password' => 'Illuminate\Support\Facades\Password',

'Queue' => 'Illuminate\Support\Facades\Queue',

'Redirect' => 'Illuminate\Support\Facades\Redirect',

'Redis' => 'Illuminate\Support\Facades\Redis',

'Request' => 'Illuminate\Support\Facades\Request',

'Response' => 'Illuminate\Support\Facades\Response',

'Route' => 'Illuminate\Support\Facades\Route',

'Schema' => 'Illuminate\Support\Facades\Schema',

'Seeder' => 'Illuminate\Database\Seeder',

'Session' => 'Illuminate\Support\Facades\Session',

'Str' => 'Illuminate\Support\Str',

'URL' => 'Illuminate\Support\Facades\URL',

'Validator' => 'Illuminate\Support\Facades\Validator',

'View' => 'Illuminate\Support\Facades\View',

),

);

$app['sae'] = false;

if (defined('SAE_ACCESSKEY') && (substr(SAE_ACCESSKEY, 0, 4 ) != 'kapp')) {

$removeProviders = array(

'Illuminate\Cache\CacheServiceProvider',

'Illuminate\View\ViewServiceProvider',

'Illuminate\Session\SessionServiceProvider',

);

foreach ($app['providers'] as $key => $provider) {

if (in_array($provider, $removeProviders)) {

unset($app['providers'][$key]);

}

}

$app['providers'] = array_merge($app['providers'], array(

'Lavender\Cloud\Sina\Cache\CacheServiceProvider',

'Lavender\Cloud\Sina\Storage\StorageServiceProvider',

'Lavender\Cloud\Sina\View\ViewServiceProvider',

'Lavender\Cloud\Sina\Session\SessionServiceProvider',

));

$app['aliases']['Storage'] = 'Lavender\Cloud\Sina\Storage\Storage';

$app['sae'] = true;

}

return $app;

以上代码主要作用:在判断程序运行在 SAE 运行环境下的时候,自动注入相应的类取代 Laravel 自带的类实现。

2. 修改 app/config/database.php

使用 SAE 数据库设置常量配置我们的数据库设置。

'mysql' => array(

'driver' => 'mysql',

'host' => SAE_MYSQL_HOST_M,

'database' => SAE_MYSQL_DB,

'username' => SAE_MYSQL_USER,

'password' => SAE_MYSQL_PASS,

'charset' => 'utf8',

'collation' => 'utf8_general_ci',

'prefix' => '',

),

3. 配置 app/config/cache.php 和 app/config/session.php

'driver' => 'memcache',

使用 SAE 提供的 memcache 驱动。

4. 配置本地开发环境

Laravel 支持自定义开发环境,一般本地开发就是 local 配置啦,这里可以在 bootstrap/start.php 中设置。

然后我们在 app/config/local 文件夹下配置本地开发环境配置。

经过以上配置,我们搭建了本地开发和SAE运行环境的配置分离。

然后就是尽情开发啦~~~~~~~~~

上传代码到 SAE

这里需要整个项目打包上传,推荐使用 SAE 的 SVN 上传。

等下,上传之前还有重要的一步

Laravel 使用的包中,有涉及到直接修改 php.ini 的操作,这个东西会导致程序直接抛错。

不用担心,上传之前只需执行:

php artisan sae:patch

一切都变得美好了。

最后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值