根据需要离线/在线转换应用程序?

时间:2015-07-02 09:20:18

标签: php yii

我们正在开发一款带Flash(前端)和Yii 1.1.16 - PHP(后端)的浏览器游戏。游戏服务器是一个yii web-app,它接收来自客户端的请求以使游戏进展。我们的目的是在某些时候有多台服务器。

我想做什么:从我们构建的中央管理面板,我希望能够通过按下按钮然后转动来设置游戏服务器(yii web app)离线它就开始了。

我想到了两种方法,一种方式似乎更合乎逻辑,但我希望对最佳实践有所了解。

1)第一种方法是在数据库中存储一个布尔字段(isOnline),并在每个操作之前用select读取它。如果为false,我将呈现适当的视图,通知请求者服务器处于脱机状态。首席程序员不太喜欢这个想法,因为他不希望每次请求都有一个额外的数据库查询(你认为这是一个负担吗?)。

2)因为上面的“问题”,我想出了一个不使用数据库的不同解决方案。相反,我正在以yii方式使用文件。每当我想打开/关闭应用程序时,我都会重写一个包含bool的文件。然后我在每个动作/请求之前阅读这个bool。一些代码如下:

在config / main.php中我将它添加到params:

'params'=>array(
    'isOnline' => require(dirname(__FILE__).'/online.php'),
    ...
)

config / online.php文件就是这样:

<?php
//param that decides if server is online or not
return false;

在Controller beforeAction中我有这个:

//If server is offline
if(!Yii::app()->params['isOnline'] )
{
    //allow only 'switch' action
    if(Yii::app()->controller->id.'/'.Yii::app()->controller->action->id == 'test/switch')
    {
        return true;
    }
    //else diplay offline view
    $this->renderPartial('//site/offline');
    Yii::app()->end();
}

为了改变在线状态(行动需要改进,它现在只适用):

public function actionSwitch ()
{
    //Get online input, TODO add input checks
    $isOnline = $_GET['online'];

    //Create online.php file contents, using a simple view with an echo inside
    $fileContent = $this->renderPartial('//site/online', array('online' => $isOnline), true);

    //Open config/online.php file
    $file = fopen(dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'online.php', 'w');

    //Write new content to file
    fwrite($file, $fileContent);

    //Close file
    fclose($file);
} 

我个人更喜欢第一种方法,我对第二种方法的安全性有所怀疑。您的意见是什么(一般情况下,然后考虑到我的同事对数据库解决方案的重新分析)?还有其他方法吗?

非常感谢advantange。

2 个答案:

答案 0 :(得分:0)

Is much better to use this extension https://github.com/ekaragodin/MaintenanceMode

The only I had added a condition into init method of MaintenanceMode.php, as I store settings in DB.

main.php

// First of all I initiate my settings component, to able getting required options from DB
'preload' => array('log','setting','maintenanceMode'),

MaintenanceMode.php

public function init(){
    if ( !$this->enabledMode ) {
        return;
    }

    // Then check your flag
    if ( !Yii::app()->setting->is_offline ) {
        return;
    }
    // ...

With this extension you may switch off via main.php just set enabledMode false. Or you may write value into the file and then read it. Also you may setup cache.

答案 1 :(得分:0)

Personaly for that simple case, I'd choose your first option plus Mysql Memory Storage Engine. You will have the same performance as a cache, without the infraestructure to implement it. While memory comsuption will be mimimal for a one record table.