云计算开发者社区

用新浪微博连接

一步搞定

查看: 21113|回复: 23

Let's run Laravel 4 on SAE [复制链接]

Rank: 2

发表于 2014-1-1 21:14:15 |显示全部楼层
Let's run Laravel 4 on SAE

By chekun aka @jeongee 2014.1.1 晚首发与SAE开发者论坛

相信大家也都或多或少的了解过Laravel框架吧,本人以前是使用CodeIgniter框架的,2012年接触到了当时候的Laravel 3,立马就被它吸引了,关于它的介绍,我在这里不做详谈,感兴趣的可以到其官网查看了解.

对于SAE来说,云环境的一些限制让我们无法很直接自由的使用L4,先来看几点核心的:

- SAE限制了本地文件读写,L4对于一些缓存(如manifest)是采用了本地写的。
- 缓存类,L4并没有直接提供SAE可直接使用的缓存类。
- Session类,L4的Native Session并不是PHP的原生Session,用到了本地文件写,所以不可以行,这点可以结合缓存类进行解决。
- SAE默认session_start(),而使用了Symfony Session的L4,自然继承了seesion类和自动session_start冲突的问题。
- 模版引擎,依然是本地文件写的问题.

那么,想要在SAE上使用L4,那么必须解决以上几个问题。

幸运的是,PHP5的新特性和L4强大的扩展能力使得我们可以轻松解决上述问题。

这里我写了个项目,可以让您的L4项目优雅的本地开发和运行与SAE平台。

本文不会详细介绍如何改造,感兴趣的可以直接去看源代码,本文说明一下,如何改造本地项目,做到本地开发和SAE线上运行无痛切换。

本地项目开发改造:

改造app/config/app.php

<?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环境下的时候注入相应的类取代L4自带的类。

配置app/config/database.php

'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'  => '',
),


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

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

'driver' => 'memcache',


使用提供的memcache启动。

配置本地开发环境

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

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

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

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

上传代码到SAE

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

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

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

不用担心,上传之前只需执行:
[code="PHP"]php artisan sae:patch[/code]

一切都变得美好了。

最后

做个小宣传,也是我的运行SAE上的L4的程序,当个DEMO吧~~

www.dilicms.com

使用道具 举报

Rank: 2

发表于 2014-1-1 21:21:47 |显示全部楼层
本帖最后由 jeongee 于 2014-1-1 21:23 编辑

这里是我写的给L4适配SAE的项目 https://github.com/chekun/laravel4sae

申精

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2014-1-2 10:09:25 |显示全部楼层
已经加精,这个不错啊!

使用道具 举报

Rank: 2

发表于 2014-1-2 11:26:43 |显示全部楼层
zhaixiaohu 发表于 2014-1-2 10:09
已经加精,这个不错啊!

多谢管理员。

论坛的格式不好,这里是原生的MD文件。

https://github.com/chekun/laravel4sae/blob/master/HOW-TO.md

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2014-1-2 11:27:23 |显示全部楼层
jeongee 发表于 2014-1-2 11:26
多谢管理员。

论坛的格式不好,这里是原生的MD文件。

恩,论坛格式确实不太好,但我看有些用户发的格式还可以,我咨询下她们怎么弄的,然后弄个帖子说明下。

使用道具 举报

Rank: 1

发表于 2014-1-6 14:19:52 |显示全部楼层
这个必须要支持, 最近也准备来学习下Laravel, 之前也一直用的是ci.
dilicms我也是通过ci论坛了解的, 原来是你写的.

使用道具 举报

Rank: 2

发表于 2014-1-7 15:06:18 |显示全部楼层
xiaoooma 发表于 2014-1-6 14:19
这个必须要支持, 最近也准备来学习下Laravel, 之前也一直用的是ci.
dilicms我也是通过ci论坛了解的, 原来是 ...

献丑了

使用道具 举报

Rank: 1

发表于 2014-1-8 23:34:55 |显示全部楼层
Nice job !

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2014-1-11 17:26:02 |显示全部楼层
赞!!!

使用道具 举报

Rank: 7Rank: 7Rank: 7

发表于 2014-1-11 18:13:29 |显示全部楼层
这个得支持一下~~很实用,既然楼主放出了,那我就顺带也搞个L4的应用吧~
IT早报网              我的导航站         FarisLee

使用道具 举报

Rank: 2

发表于 2014-1-11 23:00:50 |显示全部楼层

使用道具 举报

Rank: 2

发表于 2014-1-13 14:07:12 |显示全部楼层
锐子-Ray 发表于 2014-1-8 23:34
Nice job !

嘿嘿

使用道具 举报

Rank: 2

发表于 2014-1-13 14:08:20 |显示全部楼层
Faris 发表于 2014-1-11 18:13
这个得支持一下~~很实用,既然楼主放出了,那我就顺带也搞个L4的应用吧~

多谢版主支持

使用道具 举报

Rank: 2

发表于 2014-1-13 14:14:19 |显示全部楼层
Sn伟伟 发表于 2014-1-11 23:00

多谢支持

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2014-1-20 23:41:07 |显示全部楼层
好像不支持4.1版本,已提交Issue

使用道具 举报

Rank: 2

发表于 2014-1-21 11:00:06 |显示全部楼层
smallcode 发表于 2014-1-20 23:41
好像不支持4.1版本,已提交Issue

嗯,做的时候4.1还没发布,我来试试看哈。

使用道具 举报

Rank: 2

发表于 2014-1-21 22:05:50 |显示全部楼层
支持最新的4.1.x了,建了个官网

http://laravel4sae.sinaapp.com/

使用道具 举报

Rank: 1

发表于 2014-2-11 20:52:52 |显示全部楼层
支持持续更新

使用道具 举报

Rank: 2

发表于 2014-4-28 11:13:27 |显示全部楼层
锐子-Ray 发表于 2014-2-11 20:52
支持持续更新

更新了1.1.0版本了
本版本加入了对SAE日志的支持。

http://me.dilicms.com/open-sourc ... g-since-v1-1-0.html

使用道具 举报

Rank: 1

发表于 2014-5-31 20:53:05 |显示全部楼层
本帖最后由 nikbobo 于 2014-5-31 20:57 编辑

请问如果上传的话,Laravel 的 Public 目录才是网站根目录怎么办?SAE 的规则怎么办?
哦,还有 Composer 的依赖包怎么办?

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|云计算开发者社区 ( 京ICP证000007-137 )

GMT+8, 2018-9-21 18:46 , Processed in 0.198008 second(s), Total 12, Slave 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部