应用Yii11和PHP5进行敏捷Web开发_第十三章迭代10上线投产准备

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第十三章:迭代10:上线/投产准备尽管我们的应用程序还有很多功能上的不足,(虚构)截止日期的临近和客户对产品投入生产环境感到很焦虑。但在投产之前还有一些事值得做。这正是我们最后一次迭代需要完成的工作。迭代计划我们将专注与以下任务,使得我们的应用程序适应生产环境:启动Yii的应用程序日志框架,使得所有致命的错误和事件都被记录下来启动Yii的错误控制框架,使得我们能明白它在开发与生产环境中的不同启动应用程序数据缓存来帮助增进性能日志日志是在应用程序开发的最后一步应该被提起的一个主题。信息,警告,严重错误信息在引起应用程序崩溃时时非常有价值的,在生产环境中它们大多被实际用户使用。Yii提供了一个弹性且可扩展的日志功能。日志信息可以依据日志等级和信息类型被分类。通过使用等级和类型过滤器,使得被选中的信息被路由至不同目的地,比如写入磁盘文件,发送至管理员信箱,或者显示在浏览器窗口中。日志信息每次请求的时候我们的应用程序都会记录大量信息。当程序被初始化完成后,程序被配置成调试模式,并且在该模式下Yii框架自身记录日志信息。我们可以查看到该信息,因为默认的这些信息被保存在内存中。因此,它们的生存周期与请求相同。根目录的index.php文件中的如下代码,决定了应用程序是否处于调试模式:PHP代码:defined('YII_DEBUG')ordefine('YII_DEBUG',true);让我们在SiteController类添加一个小action来看看被记录的内容,代码如下:PHP代码:publicfunctionactionShowLog(){echoLoggedMessages:brbr;var_dump(Yii::getLogger()-getLogs());}如果我们通过请求:来调用该action,我们将看到与下面类似的画面:如果我们注释掉在index.php中定义的全局应用程序条件变量,并刷新页面,我们将看不到日志内容。这是因为系统级调试信息等级事通过Yii::trace来创建的,只有当应用程序处于该特殊调试模式下才会记录信息。我们可以通过以下2个静态方法中的一个来记录信息:Yii::log($message,$level,$category)Yii::trace($message,$category)好像之前提到的,俩者的唯一区别就是Yii::trace方法只在调试模式下记录信息。类型和等级当记录一个信息,我们需要指定它的类型和等级。类型是表现为xxx.yyy.zzz格式的类似路径代理的字符串。例如,如果在SiteController类中记录一条信息,我们可以选择使用application.controllers.SiteController作为类型。类型为被记录信息提供了而外的内容。另外当使用Yii::log为被记录信息指定一个类型时可以同时指定一个等级。等级可以被认为是该消息的缩略。虽然你可以自定义等级,但是一般我们使用以下的一种:Trace:这一等级一般被用来基于开发环境的应用程序工作流Info:这个是日志的大概内容,而且也是未指定下的默认类型Profile:这一等级被用来描述上面提到的性能方面的功能Warning:警告信息Error:错误信息添加一个登录日志信息作为一个例子,让我们为用户登录方法添加一些日志。我们将在该方法的开头添加一些基本调试信息,用来标识该方法正在被执行。然后在登录成功时我们将记录一个信息性的消息,同样的在登录失败时记录一个警告。按照如下代码修改我们的SiteController::actionLogin()方法:PHP代码:/***Displaystheloginpage*/publicfunctionactionLogin(){Yii::app()-language='rev';Yii::trace(TheactionLogin()methodisbeingrequested,application.controllers.SiteController);if(!Yii::app()-user-isGuest){$this-redirect(Yii::app()-homeUrl);}$model=newLoginForm;//ifitisajaxvalidationrequestif(isset($_POST['ajax'])&&$_POST['ajax']==='login-form'){echoCActiveForm::validate($model);Yii::app()-end();}//collectuserinputdataif(isset($_POST['LoginForm'])){$model-attributes=$_POST['LoginForm'];//validateuserinputandredirecttothepreviouspageifvalidif($model-validate()&&$model-login()){Yii::log(Successfulloginofuser:.Yii::app()-user-id,info,application.controllers.SiteController);$this-redirect(Yii::app()-user-returnUrl);}else{Yii::log(Failedloginattempt,warning,application.controllers.SiteController);}}//displaytheloginform//publicstringfindLocalizedFile(string$srcFile,string$srcLanguage=NULL,string$language=NULL)$this-render('login',array('model'=$model));}如果我们成功登录(或者进行了一次错误的尝试),然后访问我们的日志,我们看不到它们(如果你注释掉了调试模式申明,请确保你的应用程序已经开启调试模式)。再一次,原因是默认的,日志会存储在内存中。在请求完成后它们就会消失。这会显得很没价值。我们需要将其导航至持久存储的地方,这样我们才可以在请求之后查看我们生成的日志。消息路由如我们所说,默认的,Yii::log和Yii::trace将信息存储在内存中。一般的,将这些消息显示在浏览器窗口中会使得它们非常有价值,或者存储到一些持久化介质中,或者是发送email,甚至是数据库中。Yii的消息路由功能允许将日志信息路由至不同目的地。在Yii中消息路由是由CLogRouter应用程序组件管理的。它允许你定义一系列消息目的地。为了利用消息路由的功能,我们需要在protected/config/main.php中配置CLogRouter应用程序组件。我们通过设置它的routes属性为需要的路由地址来完成该动作。如果我们打开配置文件,我们将看到一些预先设置好的配置信息(是在使用yiic的webapp命令生成应用程序时生成的)。下面是默认定义在应用程序中的内容:PHP代码:'log'=array('class'='CLogRouter','routes'=array(array('class'='CFileLogRoute','levels'='error,warning',),//uncommentthefollowingtoshowlogmessagesonwebpages/*array('class'='CWebLogRoute',),*/),),路由应用程序组件被配置为使用框架的CLogRouter类。你可以使用自定义的类如果你的路由需求无法使用框架基本类来实现,但是在这里,不需要做改变。在该类定义的下面定义了routes属性。在这个例子中,只定义了一个路由。它使用了Yii框架的消息路由类CFileLogRoute。CFileRoute消息路由类使用文件系统来保存消息。默认的,文件被保存至/protected/runtime/application.log中。事实上,如果你一直跟随着我们的教程并且完成了自己的应用程序,你可以打开该文件看看yii为你保存的消息。只有error和warning类型的消息将被路由至该文件。前面代码中注释掉了另外一个路由类CWebLogRoute。如果使用它,消息将会显示在当前页面。下面是一个Yii1.1版的消息路由列表:CDbLogRoute:将消息存储到数据库表中CEmailLogRoute:将消息发送至特定的e-mail地址CFileLogRoute:将消息保存至应用程序runtime文件夹下的一个文件中CWebLogRoute:在当前页面的结尾显示消息CProfileLogRoute:在当前页面结尾显示profiling消息添加日志至SiteController::actionLogin()方法中使用了Yii::trace和Yii::log。当使用Yii::trace时,日志的等级被自动设置为trace。使用Yii::log时,如果登录成功,我们将等级设置为info,如果失败则设置为warning级。让我们修改配置文件,将trace和info级消息写入一个叫infoMessages的新文件,该文件与application.log在同一文件夹。同时也配置其将warning消息显示在浏览器中。为了完成这一操作,我们对配置文件进行如下修改:PHP代码:'log'=array('class'='CLogRouter','routes'=array(array('class'='CFileLogRoute','levels'='error',),array('class'='CFileLogRoute','levels'='info,trace','logFile'='infoMessages.log',),array('class'='CWebLogRoute','levels'='warning',),...此时,在我们保存修改后,让我们看看改变。首先,进行一次成功登录。应用程序会因此写入2条消息到/protected/runtime/infoMessages.log文件(为新建文件),第一条为trace,后面一条为成功登录。成功登录后,文件内容如下(由于篇幅关系并未全部显示):SHELL代码或屏幕回显:...2010/04/1500:31:52[trace][application.controllers.SiteController]TheactionLogin()methodisbeingrequested2010/04/1500:31:52[trace][system.web.CModule]Loadinguserapplicationcomponent2010/04/1500:31:52[trace][system.web.CModule]Loadingsessionapplicationcomponent2010/04/1500:31:52[trace][system.web.CModule]Loadingdbapplicationcomponent2010/04/1500:31:52[trace][system.db.CDbConnection]OpeningDBconnection...2010/04/1500:31:52[info][application.controllers.SiteController]Successfulloginofuser:1...哇哦,这里的消息绝对不是2条。但是其中一定有我们写入的2条。它们在上面的列表中被加粗显示。现在开始,因为我们将trace路由至该新建文件,所以基于框架的所有trace都会

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功