Yiiで作ったサイトを公開する際にすること

Yiiで作ったサイトを公開する際にしたことをまとめておきます。

  • Yiiのディレクトリ構造を変更する
  • 設定ファイルを分割する
  • 開発環境と公開環境で違う設定ファイルを利用する

Yiiのディレクトリ構造を変更する

Yiiのフレームワークだとか、protected以下のファイルは公開ディレクトリ以下に設置したくないので、以下のようにディレクトリ構造を変更します。

  • 公開ディレクトリ(/var/www/html)には、protectedディレクトリ以外のディレクトリやファイルを設置する。
  • /var/www/yii/example以下にprotectedディレクトリを設置する。
  • /var/www/yii/framework以下にはYiiのフレームワークを設置する。

修正するファイルは、index.php、index-test.phpとprotected/yiic.phpの3つ。

//index.phpの修正部分
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/../yii/example/protected/config/main.php';

//index-text.phpの修正部分
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/../yii/example/protected/config/test.php';

//protected/yiic.phpの修正部分
$yiic=dirname(__FILE__).'/../../framework/yiic.php';
$config=dirname(__FILE__).'/config/console.php';

設定ファイルを分割する

protected/config/main.phpのparamで設定している項目については、他の設定ファイルでも利用するため、paramの項目については、別ファイルで管理し、このファイルを設定ファイルから読み込むようにします。

protected/config/main.phpやprotected/config/console.phpなどは以下のように修正します。

// application-level parameters that can be accessed
// using Yii::app()->params['paramName']
'params'=>require(dirname(__FILE__).'/params.php'),

protected/config/params.phpを用意し、以下のようにすれば完了です。

return array(
  // this is used in mail from
  'adminEmail'=>'staff@example.jp',
);

開発環境と公開環境で違う設定ファイルを利用する

index.php、index-test.php、protected/yiic.phpで、読み込んでいる設定ファイルをサーバの環境変数によって切り替えるようにします。

例えば、index.phpであれば以下のような感じです。
HTTP_HOSTがlocalhostかどうかで判断しています。また、読み込む設定ファイルだけでなく、公開環境では、デバッグモードを無効にします。

if($_SERVER['HTTP_HOST']=='localhost')
{
  // change the following paths if necessary
  $yii=dirname(__FILE__).'/../../yii/framework/yii.php';
  $config=dirname(__FILE__).'/protected/config/development.php';

  // remove the following lines when in production mode
  defined('YII_DEBUG') or define('YII_DEBUG',true);
  // specify how many levels of call stack should be shown in each log message
  defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
}
else
{
  // change the following paths if necessary
  $yii=dirname(__FILE__).'/../yii/framework/yii.php';
  $config=dirname(__FILE__).'/../yii/example/protected/config/production.php';
}

require_once($yii);
Yii::createWebApplication($config)->run();

設定ファイルのprotected/config/main.phpですが、このファイルには開発環境、公開環境の両方で利用する設定を書くようにし、protected/config/development.phpには開発環境でのみ利用する設定、protected/config/production.phpには公開環境でのみ利用する設定を書きます。

protected/config/main.phpは以下のような感じです。

return array(
  'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
  //this site name
  'name'=>'テストサイト',
  'language'=>'ja',

  // preloading 'log' component
  'preload'=>array(
    'log',
  ),

  // autoloading model and component classes
  'import'=>array(
    'application.models.*',
    'application.components.*',
  ),

  // application components
  'components'=>array(
    'user'=>array(
      'class' => 'WebUser',
      // enable cookie-based authentication
      'allowAutoLogin'=>true,
    ),

    // uncomment the following to enable URLs in path-format
    'urlManager'=>array(
      'urlFormat'=>'path',
      'showScriptName' => false,
      'rules'=>array(
        '<controller:\w+>/<id:\d+>'=>'/view',
        '<controller:\w+>/<action:\w+>/<id:\d+>'=>'/',
        '<controller:\w+>/<action:\w+>'=>'/',
      ),
    ),
    'errorHandler'=>array(
      // use 'site/error' action to display errors
      'errorAction'=>'site/error',
    ),
  ),

  // application-level parameters that can be accessed
  // using Yii::app()->params['paramName']
  'params'=>require(dirname(__FILE__).'/params.php'),
);

protected/config/development.phpは以下のような感じです。

return CMap::mergeArray(
    require (dirname(__FILE__).'/main.php'),
    array(
      'modules'=>array(
        // uncomment the following to enable the Gii tool

        'gii'=>array(
          'class'=>'system.gii.GiiModule',
          'password'=>'hogehoge',
          // If removed, Gii defaults to localhost only. Edit carefully to taste.
          'ipFilters'=>array('127.0.0.1','::1'),
          //bootstrap
          'generatorPaths'=>array('bootstrap.gii')
        ),

      ),

      // application components
      'components'=>array(
        'session'=>array(
          'sessionName' => 'Session',
          'class'=>'CCacheHttpSession',
          'cacheID'=>'sessionCache',
          'cookieMode'=>'only',
          'timeout'=>86400,
        ),
        'sessionCache'=>array(
          'class'=>'CApcCache',
        ),

        'db'=>array(
          'connectionString' => 'mysql:host=localhost;dbname=hoge',
          'emulatePrepare' => true,
          'username' => 'hoge',
          'password' => '4uDH',
          'charset' => 'utf8',
        ),

        'log'=>array(
          'class'=>'CLogRouter',
          'routes'=>array(
            array(
              'class'=>'CWebLogRoute',
              'levels'=>CLogger::LEVEL_PROFILE,
              'showInFireBug'=>true,
              'ignoreAjaxInFireBug'=>true,
            ),
            array(
              'class'=>'CWebLogRoute',
            ),
          ),
        ),
      ),
    )
);

protected/config/production.phpは以下のような感じです。

return CMap::mergeArray(
    require (dirname(__FILE__).'/main.php'),
    array(
      // application components
      'components'=>array(
        'cache'=>array(
          'class'=>'system.caching.CApcCache',
        ),
        'session'=>array(
          'sessionName' => 'Session',
          'class'=>'CCacheHttpSession',
          'cacheID'=>'sessionCache',
          'cookieMode'=>'only',
          'timeout'=>600,
        ),
        'sessionCache'=>array(
          'class'=>'CApcCache',
        ),

        'db'=>array(
          'connectionString' => 'mysql:host=db.exmple.jp;dbname=hoge',
          'emulatePrepare' => true,
          'username' => 'hoge',
          'password' => 'dfuDH',
          'charset' => 'utf8',

          //cache schema
          'schemaCachingDuration' => 3600, //sec
        ),
        'log'=>array(
          'class'=>'CLogRouter',
          'routes'=>array(
            array(
              'class'=>'CFileLogRoute',
              'levels'=>CLogger::LEVEL_ERROR,
              'logFile'=>'level_error.txt',
              'filter'=>'CLogFilter',
            ),
          ),
        ),
      )
  )
);

公開環境では、キャッシュを有効にしています。
また、ActiveRecordを利用しているので、

'schemaCachingDuration' => 3600, //sec

で、データベーススキーマをキャッシュするようにし、スキーマの解析時間を減らします。こうすることで、スキーマを解析するために発行されていた以下のようなSQLの発行を制限できます。

SHOW FULL COLUMNS FROM `tbl_event`;
SHOW CREATE TABLE `tbl_event`;

ただし、テーブル構造の変更があった場合、実際のテーブル構造とキャッシュに違いが出るため問題になります。この場合、キャッシュを削除する必要があります。

キャッシュにCApcCacheを利用しているのであれば、httpdなどのウェッブサーバを再起動したらキャッシュは削除されます。

投稿日:
カテゴリー: php タグ: