第16章—应用程序管理工具
在开发和部署阶段,开发人员都需要一致的诊断信息流,以确定应用程序是否按预期工作。这些信息通常通过日志记录和调试实用程序聚合。由于symfony等核心角色框架在驱动应用程序中发挥作用,因此将这些功能紧密集成起来以确保高效的ob娱乐下载开发和操作活动是至关重要的。
在生产服务器上的应用程序的生命周期中,应用程序管理员会重复大量的任务,从日志轮换到升级。框架还必须提供尽可能自动化这些任务的工具。
本章解释symfony应用程序管理工具如何满足所有这ob娱乐下载些需求。
日志记录
了解请求执行过程中哪里出了问题的唯一方法是查看执行过程的跟踪。幸运的是,正如您将在本节中了解到的,PHP和symfony都倾向于记录大量这类数据。ob娱乐下载
PHP的日志
PHP有一个error_reporting
参数,在php . ini
,它指定记录哪些PHP事件。ob娱乐下载中的每个应用程序和环境中,Symfony允许您重写此值settings.yml
如清单16-1所示。
清单16-1 -设置错误报告级别,在前端/ config / settings.yml
Prod: .settings: error_reporting: dev: .settings: error_reporting:
为了避免生产环境中的性能问题,服务器只记录关键的PHP错误。但是,在开发环境中,所有类型的事件都被记录下来,这样开发人员就可以拥有跟踪错误所需的所有信息。
PHP日志文件的位置取决于您的php . ini
配置。如果您从未费心定义这个位置,PHP可能使用web服务器提供的日志工具(例如Apache错误日志)。在这种情况下,您将在web服务器日志目录下找到PHP日志。
ob娱乐下载Symfony的日志
除了标准的PHP日志外,symfony还可以记录许多自定义事件。ob娱乐下载您可以在下面找到所有的symfony日志ob娱乐下载myproject /日志/
目录中。每个应用程序和环境都有一个文件。的开发环境日志文件前端
应用程序命名frontend_dev.log
,命名为生产型frontend_prod.log
等等。
如果您有一个正在运行的symob娱乐下载fony应用程序,请查看它的日志文件。语法非常简单。对于每个事件,将一行添加到应用程序的日志文件中。每一行都包括事件的确切时间、事件的性质、正在处理的对象以及任何其他相关细节。清单16-2显示了symfony日志文件内容的示例。ob娱乐下载
清单16-2 - Symfony日志文件内容ob娱乐下载示例,在日志/ frontend_dev.log
11月15日16:30:25 sob娱乐下载ymfony [info] {sfAction} call "barActions->executemessages()"Nov 15 16:30:25 ob娱乐下载symfony [info] {sfPropelLogger} executeQuery: SELECT bd_message.ID…11月15日16:30:25 sob娱乐下载ymfony [info] {sfView} set slot "leftbar" (bar/index) Nov 15 16:30:25 symfony [info] {sfView} set slot "messageblock" (bar/mes…11月15日16:30:25 sob娱乐下载ymfony [info] {sfView} execute view for template "messa…"11月15日16:30:25 sob娱乐下载ymfony [info] {sfView} render "/home/production/myproject/…11月15日16:30:25 sob娱乐下载ymfony [info] {sfView}渲染给客户端
您可以在这些文件中找到许多详细信息,包括发送到数据库的实际SQL查询、调用的模板、对象之间的调用链,等等。
请注意
文件日志的格式可通过重写格式
和/或time_format
设置factories.yml
如清单16-3所示。
清单16-3 -修改日志格式
all: logger: param: sf_file_debug: param: format: %time% %type% [%priority%] %message%%EOL% time_format: %b %d %H:%M:%S
ob娱乐下载Symfony日志级别配置
symfony日志消息有8个级别:ob娱乐下载紧急情况
,警报
,暴击
,犯错
,警告
,请注意
,信息
,调试
,与梨:日志
包的水平。中的每个环境中要登录的最大级别factories.yml
配置文件,如清单16-4所示。
清单16-4 -默认日志记录配置,在前端/ config / factories.yml
Prod: logger: param: level: err
默认情况下,在除生产环境之外的所有环境中,都会记录所有消息(直到最不重要的级别,即调试
级别)。在生产环境中,默认禁用日志记录;如果你改变logging_enabled
来真正的
在settings.yml
,只有最重要的信息(来自暴击
来紧急情况
)出现在日志中。
中的日志记录级别factories.yml
文件,以限制日志消息的类型。
提示
要查看是否启用了日志记录,请调用sfConfig: get(“sf_logging_enabled”)
.
添加日志信息
您可以使用清单16-5中描述的技术之一,从代码中手动在symfony日志文件ob娱乐下载中添加消息。
清单16-5 -添加自定义日志消息
//从一个动作这个美元->logMessage(美元的消息,美元的水平);//从模板<?phpuse_helper(“调试”)? ><?phplog_message(美元的消息,美元的水平)? >
美元的水平
可以与日志消息中的值相同。
或者,要从应用程序中的任何地方在日志中写入消息,请使用sfLogger
方法,如清单16-6所示。可用的方法名称与日志级别相同。
清单16-6 -从任何地方添加自定义日志消息
如果(sfConfig::得到(“sf_logging_enabled”)){sfContext::getInstance()->getlog()->信息(美元的消息);}
侧边栏
自定义日志
ob娱乐下载Symfony的日志系统非常简单,但是也很容易定制。惟一的先决条件是记录器类必须扩展sfLogger
类,它定义了doLog ()
方法。ob娱乐下载Symfony调用doLog ()
具有两个参数的方法:美元的消息
(要记录的消息),以及美元的优先级
(日志级别)。
的myLogger
类使用PHP定义了一个简单的日志记录器error_log
功能:
类myLogger扩展sfLogger{受保护的函数doLog(美元的消息,美元的优先级){error_log(sprintf(“% s (% s)”,美元的消息, sfLogger::getPriorityName(美元的优先级)));}}
要从现有类创建记录器,只需实现sfLoggerInterface
接口,该接口定义了日志()
方法。方法的两个参数相同doLog ()
方法:
require_once(“Log.php”);require_once(“日志/ error_log.php”);//定义一个瘦包装器来实现接口//我们想要使用symfony的日志记录器ob娱乐下载类Log_my_error_log扩展Log_error_log实现sfLoggerInterface{}
清除和旋转日志文件
别忘了定期清洗日志/
目录,因为这些文件有一个奇怪的习惯,即在几天内增长几兆字节,当然,这取决于您的流量。ob娱乐下载Symfony提供了一个特殊的日志:清晰
任务,您可以定期手动启动该任务,也可以将其放入cron表中。例如,清除symfony日志文件:ob娱乐下载
$ PHP ob娱乐下载symfony日志:清除
为了获得更好的性能和安全性,您可能希望将symfony日志存储在几个小文件中,而不是一个大文件中。ob娱乐下载日志文件的理想存储策略是定期备份和清空主日志文件,但只保留有限数量的备份。属性可以启用这样的日志旋转期
的7
天和一个历史
(备份数)的10
,如清单16-7所示。您将使用一个活动日志文件加上十个备份文件,每个备份文件包含七天的历史记录。每当下一个七天周期结束时,当前活动日志文件将进入备份,并擦除最早的备份。
清单16-7 -启动日志旋转
$ PHP ob娱乐下载symfony log:rotate frontend prod——period=7——history=10
日志备份文件存放在日志/历史/
目录,并加上保存日期的后缀。
调试
无论您是多么熟练的程序员,您最终都会犯错误,即使您使用symfony。ob娱乐下载检测和理解错误是快速应用程序开发的关键之一。幸运的是,symfony为ob娱乐下载开发人员提供了几种调试工具。
ob娱乐下载Symfony调试模式
ob娱乐下载Symfony有一种调试模式,可以促进应用程序的开发和调试。当它打开时,会发生以下情况:
- 在每个请求时都会检查配置,因此任何配置文件中的更改都会立即生效,而不需要清除配置缓存。
- 错误消息以一种清晰而有用的方式显示完整的堆栈跟踪,以便您可以更有效地找到错误元素。
- 还有更多的调试工具可用(比如数据库查询的详细信息)。
- Propel/Doctrine调试模式也被激活,因此对Propel/Doctrine对象的调用中的任何错误都将通过Propel/Doctrine架构显示详细的调用链。
另一方面,当调试模式关闭时,处理如下:
- YAML配置文件只解析一次,然后转换为PHP文件存储在
缓存/ config /
文件夹中。第一个请求之后的每个请求都会忽略YAML文件,而是使用缓存的配置。因此,请求的处理速度要快得多。 - 若要允许重新处理配置,必须手动清除配置缓存。
- 在处理请求期间的错误将返回一个代码为500(内部服务器错误)的响应,并且没有对问题的内部原因进行任何解释。
调试模式在前端控制器的每个应用程序中被激活。对象的第三个参数的值控制getApplicationConfiguration ()
方法调用,如清单16-8所示。
清单16-8 -调试模式开启的前端控制器示例web / frontend_dev.php
<?phprequire_once(目录名(__FILE__).“/ . . / config / ProjectConfiguration.class.php”);美元配置= ProjectConfiguration::getApplicationConfiguration(“前端”,“开发”,真正的);sfContext::createInstance除外(美元配置)->调度();
谨慎
在您的生产服务器中,不应该激活调试模式,也不应该让任何处于调试模式的前端控制器可用。调试模式不仅会降低页面传递的速度,而且还可能暴露应用程序的内部结构。尽管调试工具从不显示数据库连接信息,但是异常的堆栈跟踪对于任何恶意的访问者来说都充满了危险的信息。
ob娱乐下载Symfony的例外
当在调试模式下发生异常时,symfony将显示一个有用的异常通知,其中包含查找问题原因所ob娱乐下载需的所有内容。
异常消息写得很清楚,并引用了最可能的问题原因。它们通常提供修复问题的可能解决方案,对于大多数常见问题,异常页面甚至包含指向symfony网站页面的链接,其中包含有关异常的更多详细信息。ob娱乐下载异常页面显示了PHP代码中错误发生的位置(语法高亮显示),以及完整的方法调用堆栈,如图16-1所示。您可以跟踪到导致问题的第一个调用。还显示了传递给方法的参数。
请注意
ob娱乐下载Symfony实际上依赖于PHP异常来进行错误报告。例如,404错误可以由sfError404Exception
.
图16-1 symfony应用程序异常消息示例ob娱乐下载
在开发阶段,symfony异常在调试应用程序时非常有用。ob娱乐下载
Xdebug扩展
的XdebugPHP扩展允许您扩展由web服务器记录的信息量。ob娱乐下载Symfony在它自己的调试反馈中集成了Xdebug消息,所以在调试应用程序时激活这个扩展是个好主意。扩展的安装很大程度上取决于您的平台;详细的安装指南请参考Xdebug网站。安装Xdebug之后,需要在您的php . ini
安装后文件。对于*nix平台,这是通过添加以下行来完成的:
zend_extension = " / usr /地方/ lib / php /扩展/不-调试-非zt型- 20041030 / xdebug.so”
对于Windows平台,Xdebug激活由这一行触发:
扩展= php_xdebug.dll
清单16-9给出了一个Xdebug配置示例,它也必须添加到php . ini
文件。
清单16-9 - Xdebug配置示例
xdebug。xdebug profiler_enable = 1。xdebug profiler_output_dir = " / tmp / xdebug”。auto_trace = 1;启用跟踪xdebug。xdebug trace_format = 0。show_mem_delta = 0;内存差异;xdebug。show_local_vars = 1; xdebug.max_nesting_level = 100
必须重新启动web服务器才能激活Xdebug模式。
谨慎
不要忘记在生产平台中禁用Xdebug模式。不这样做会大大降低每个页面的执行速度。
Web调试工具栏
日志文件包含有趣的信息,但是不太容易阅读。最基本的任务是找到为特定请求记录的行,如果有几个用户同时使用一个应用程序并且有很长的事件历史记录,那么这个任务可能相当棘手。这时你就需要一个web调试工具栏了。
工具栏在窗口的右上角以半透明框的形式叠加在浏览器的正常内容上,如图16-2所示。它允许访问symfony日志事件、当前配置、请ob娱乐下载求和响应对象的属性、请求发出的数据库查询的详细信息,以及与请求相关的处理时间图表。
图16-2—界面右上角出现web调试工具栏
调试工具栏背景的颜色取决于请求期间发出的日志消息的最高级别。如果没有消息传递调试
级别,工具栏有灰色背景。如果有一条消息到达犯错
关卡中,工具栏的背景为红色。
请注意
不要混淆调试模式和web调试工具栏。即使在关闭调试模式时,也可以显示调试工具栏,尽管在这种情况下,它显示的信息要少得多。
要激活应用程序的web调试工具栏,请打开settings.yml
文件并查找web_debug
关键。在刺激
而且测验
的默认值web_debug
是假
,所以你需要手动激活它如果你想要它。在dev
环境,默认配置将其设置为真正的
,如清单16-10所示。
清单16-10 - Web调试工具栏激活,在前端/ config / settings.yml
Dev: .settings: web_debug: true
当显示时,web调试工具栏提供了很多信息/交互:
- 单击symfony徽ob娱乐下载标可切换工具栏的可见性。缩小后,工具栏不会隐藏位于页面顶部的元素。
- 单击“config”部分,显示请求、响应、设置、全局变量和PHP属性的详细信息,如图16-3所示。最上面的一行总结了重要的配置设置,比如调试模式、缓存和PHP加速器的存在(关闭时显示为红色,激活时显示为绿色)。
图16-3 - config部分显示了请求的所有变量和常量
- 启用缓存时,工具栏中会出现一个绿色箭头。单击此箭头可重新处理页面,无论缓存中存储了什么(但缓存未被清除)。
- 单击“logs”部分,显示当前请求的日志消息,如图16-4所示。根据事件的重要性,它们以灰色、黄色或红色线显示。您可以使用列表顶部显示的链接筛选按类别显示的事件。
图16-4 -“日志”部分显示了当前请求的日志消息
请注意
当当前操作由重定向导致时,“日志”窗格中只显示最新请求的日志,因此日志文件对于良好的调试仍然是不可或缺的。
- 对于执行SQL查询的请求,工具栏中会出现一个数据库图标。单击可查看查询的详细信息,如图16-5所示。
- 时钟图标的右边是处理请求所需的总时间。请注意,web调试工具栏和调试模式会降低请求的执行速度,因此尽量避免考虑时间本身,只注意两个页面执行时间之间的差异。单击时钟图标,可按类别查看处理时间详情,如图16-6所示。ob娱乐下载Symfony显示请求处理的特定部分所花费的时间。只有与当前请求相关的时间才对优化有意义,因此不会显示在symfony核心上花费的时间。ob娱乐下载这就是为什么这些时间之和不等于总时间。
- 单击工具栏右侧的红色x,隐藏工具栏。
图16-5 -数据库查询部分显示了当前请求执行的查询
图16-6—时钟图标显示执行时间的类别
侧边栏
添加自己的计时器
ob娱乐下载Symfony使用sfTimer
类来计算在配置、模型、操作和视图上花费的时间。使用同一个对象,您可以计时自定义进程,并在web调试工具栏中与其他计时器一起显示结果。在进行性能优化时,这可能非常有用。
若要初始化特定代码段的计时,请调用取得时间()
方法。它将返回一个sfTimer对象并开始计时。调用addTime ()
方法用于停止计时。方法可以获得所经过的时间getElapsedTime ()
方法,并与其他方法一起显示在web调试工具栏中。
//初始化定时器并开始计时美元的计时器= sfTimerManager::取得时间(“定时器”);//做事情...//停止计时器并添加经过的时间美元的计时器->addTime();//获取结果(如果计时器还没有停止就停止)elapsedTime美元=美元的计时器->getElapsedTime();
为每个计时器命名的好处是,您可以多次调用它来累积时间。例如,如果定时器
定时器用于每个请求调用两次的实用程序方法中,第二次调用取得时间(“定时器”)
方法将从计算时的点重新启动计时addTime ()
是最后一次调用的,所以时间将与前一个时间相加。调用getCalls ()
在timer对象上,会给你定时器启动的次数,这个数据也会显示在web调试工具栏中。
//获取定时器的调用次数nbCalls美元=美元的计时器->getCalls();
在Xdebug模式下,日志消息要丰富得多。所有被调用的PHP脚本文件和函数都记录了日志,symfony知道如何将这些信息与内部日志链接起来。ob娱乐下载日志消息表的每一行都有一个双箭头按钮,您可以单击该按钮查看有关请求的进一步详细信息。如果出现问题,Xdebug模式会提供最详细的信息来找出原因。
请注意
默认情况下,Ajax响应和非html内容类型的文档中不包括web调试工具栏。对于其他页面,您可以在操作中通过简单地调用来手动禁用web调试工具栏sfConfig:集(sf_web_debug,假)
.
手动调试
能够访问框架调试消息很好,但是能够记录您自己的消息更好。ob娱乐下载Symfony提供了可以从操作和模板访问的快捷方式,以帮助您在请求执行期间跟踪事件和/或值。
您的自定义日志消息出现在symfony日志文件以及web调试工具栏中,就像常规ob娱乐下载事件一样。(清单16-5给出了自定义日志消息语法的示例。)例如,自定义消息是检查模板中变量值的好方法。清单16-11展示了如何使用web调试工具栏从模板获取开发人员的反馈(您也可以使用$ this - > logMessage ()
来自一个动作)。
清单16-11 -为调试目的在日志中插入消息
<?phpuse_helper(“调试”)? >...<?php如果(美元问题):? ><?phplog_message(“{sfAction}去过那里”,“呃”)? >...<?phpendif? >
的使用犯错
level可以保证该事件在消息列表中清晰可见,如图16-7所示。
图16-7 - web调试工具栏的“logs”部分会出现自定义日志信息
在web上下ob娱乐下载文之外使用symfony
您可能希望通过访问所有symfony类和特性的命令行(或通过cron表)执行脚本,例如启动批处理电子邮件作业或通过流程密集型计算定期更新您的模型。ob娱乐下载实现这一点的简单方法是创建一个PHP脚本,该脚本重现前端控制器的第一步,以便正确地初始化symfony。ob娱乐下载您还可以使用symfony命令行系统,以利ob娱乐下载用参数解析和自动数据库初始化。
批处理文件
初始化symfony只需要ob娱乐下载几行PHP代码。可以通过创建一个PHP文件来利用symfony的所有特性,例ob娱乐下载如在lib /
从清单16-12所示的行开始。
清单16-12 -样例批处理脚本,在lib / myScript.php
<?phprequire_once(目录名(__FILE__).“/ . . / config / ProjectConfiguration.class.php”);美元配置= ProjectConfiguration::getApplicationConfiguration(“前端”,“开发”,真正的);//如果不使用数据库层,删除下面的行databaseManager美元=新sfDatabaseManager(美元配置);//在这里添加代码
这看起来很像前端控制器的第一行(参见第6章),因为这些行做了同样的事情:初始化symfony,解析项目和应用程序配置。ob娱乐下载注意ProjectConfiguration: getApplicationConfiguration
方法期望三个参数:
- 应用程序名称
- 环境名称
- 布尔值,定义是否应该启用调试特性
要执行您的代码,只需从命令行调用脚本:
$ php lib/myScript.php
自定义任务
使用symfony创建自定义命令行脚本的另一种方法是编写ob娱乐下载ob娱乐下载symfony的任务.就像缓存:清晰
和推动:建造模式
任务,您可以使用从命令行启动自己的自定义任务php ob娱乐下载symfony
.自定义任务受益于解析命令行参数和选项的能力,可以嵌入自己的帮助文本,并可以扩展现有任务。
自定义任务只是一个类扩展sfBaseTask
位于lib /任务/
目录,可以在项目根目录下,也可以在插件目录中。它的文件名必须以'Task.class.php'结尾。清单16-13显示了一个示例自定义任务。
清单16-13 - Sample Task, inlib /任务/ testHelloTask.class.php
<?php类testHelloTask扩展sfBaseTask{受保护的函数配置(){这个美元->名称空间=“测试”;这个美元->的名字=“你好”;这个美元->briefDescription=“打招呼”;}受保护的函数执行(美元的参数=数组(),选择美元=数组()){//你的代码这个美元->日志(“Hello, world !”);}}
代码写在执行
方法可以访问所有symfony库,就像在前面的批处理脚本中ob娱乐下载一样。区别在于如何调用自定义任务:
PHP syob娱乐下载mfony测试:你好
任务名称来自受保护对象名称空间
而且的名字
属性(不是来自类名,也不是来自文件名)。由于你的任务被集成到symfony命令行中,当你输入:ob娱乐下载
$ PHP ob娱乐下载symfony
您可以使用symfony,而不是自己编写任务框架ob娱乐下载生成:任务
的任务。它创建一个空任务,并有大量的自定义选项。请通过以下电话确认:
PHP syob娱乐下载mfony帮助生成:task
任务可以接受参数(按预定义顺序的强制参数)和选项(可选和无序参数)。清单16-14显示了一个更完整的任务,它利用了所有这些特性。
清单16-14 -更完整的示例任务,在lib /任务/ mySecondTask.class.php
类mySecondTask扩展sfBaseTask{受保护的函数配置(){这个美元->名称空间=“foo”;这个美元->的名字=“mySecondTask”;这个美元->briefDescription=“有风格地做一些整洁的事情”;这个美元->detailedDescription= < < < EOF的[foo: mySecondTask |信息]任务管理实现事物的过程为你。调用它:[mySeob娱乐下载condTask frontend|INFO . php symfony foo:mySecondTask frontend|INFO . php]方法可以启用详细输出[详细|评论]选择:[php ob娱乐下载symfony foo:mySecondTask frontend——verbose=on|INFO]EOF;这个美元->addArgument(“应用程序”, sfCommandArgument::要求,“应用程序名称”);这个美元->使用addOption(“详细”,零, sfCommandOption::PARAMETER_REQUIRED,“启用详细输出”,假);}受保护的函数执行(美元的参数=数组(),选择美元=数组()){//在这里添加代码}}
请注意
如果任务需要通过访问数据库层,则应该扩展sfPropelBaseTask
而不是sfBaseTask
.任务初始化将负责加载额外的Propel类。中启动数据库连接execute ()
方法调用:
$this->configuration $databaseManager = new sfDatabaseManager;
如果任务配置定义了应用程序
和一个env
参数时,将在构建任务配置时自动考虑它们,以便任务可以使用您的数据库配置中定义的任何数据库连接databases.yml
.默认情况下,调用生成的骨架生成:任务
包括这个初始化。
有关任务系统功能的更多示例,请查看现有symfony任务的源代码。ob娱乐下载
填充数据库
在应用程序开发过程中,开发人员经常面临数据库填充的问题。对于某些数据库系统,存在一些特定的解决方案,但没有一个可以在对象-关系映射之上使用。感谢YAML和sfPropelData
对象时,symfob娱乐下载ony可以自动将数据从文本源传输到数据库。尽管为数据编写文本文件源似乎比使用CRUD接口手工输入记录要多做一些工作,但从长远来看,这将节省您的时间。您会发现这个特性对于自动存储和填充应用程序的测试数据非常有用。
Fixture文件格式
ob娱乐下载Symfony可以读取遵循非常简单的YAML语法的数据文件,只要它们位于数据/夹具/
目录中。Fixture文件按类组织,每个类部分由类名作为头引入。对于每个类,用唯一字符串标记的记录由一组字段名:价值
对。清单16-15显示了用于数据库填充的数据文件示例。
清单16-15 -样例夹具文件,在数据/夹具/ import_data.yml
文章:##在blog_article表中插入记录first_post: ##第一个唱片标签标题:我的第一个记忆内容:|在很长一段时间里,我习惯早睡。有时,当我熄灭蜡烛时,我的眼睛会很快地闭上,甚至没有时间说“我要睡觉了”。second_post: ##第二唱片公司的标题:事情变得更糟了内容:|有时他希望她会死,无痛地,在一些事故中,她在门外的街道上,穿过繁忙的大道,从早到晚。
ob娱乐下载Symfony使用camelCase转换器(setTitle ()
,setContent ()
).这意味着你可以定义一个密码
键,即使实际的表没有密码
Field,定义a向setPassword ()
方法中的用户
对象,您可以根据密码(例如,密码的散列版本)填充其他列。
主键列不需要定义。由于它是一个自动递增字段,数据库层知道如何确定它。
的created_at
列也不需要设置,因为symfony知道以这种方式命名的字段必须在创建时设置为当前系统时间。ob娱乐下载
启动导入
的推动:数据加载
task将数据从YAML文件导入到数据库。连接设置来自databases.yml
文件,因此需要一个应用程序名称来运行。可选地,您可以通过添加- - - env
选项(dev
默认情况下)。
$ PHP ob娱乐下载symfony驱动:data-load——env=prod——application=frontend
对象中的所有YAML fixture文件数据/夹具/
目录并将记录插入到数据库中。默认情况下,它将替换现有的数据库内容,但如果您添加——附加
选项,该命令将不会擦除当前数据。
$ PHP ob娱乐下载symfony驱动:data-load——append——application=frontend
您可以在调用中指定另一个fixture目录。在本例中,添加一个相对于项目目录的路径。
$ PHP ob娱乐下载symfony驱动:data-load——application=frontend data/myfixtures
使用链接表
您现在知道了如何向单个表添加记录,但是如何将带外键的记录添加到另一个表呢?由于fixture数据中没有包含主键,因此需要另一种方法来将记录彼此关联。
让我们回到第8章的例子,ablog_article
表链接到blog_comment
如图16-8所示。
图16-8 -数据库关系模型示例
这时,给记录添加的标签就变得非常有用了。要添加评论
字段到first_post
文章中,只需将清单16-16所示的行附加到import_data.yml
数据文件。
清单16-16 -向关联表中添加记录,在数据/夹具/ import_data.yml
评论:first_comment: article_id: first_post作者:匿名内容:你的散文太啰嗦。写简短的句子。
的推动:数据加载
任务将识别您先前在import_data.yml
,并获取对应的主键文章
记录以设置article_id
字段。你甚至看不到记录的id;你只需通过标签将它们联系起来——这再简单不过了。
对于链接记录的唯一约束是外键中调用的对象必须在文件的前面定义;也就是说,就像你一个一个定义它们一样。数据文件从上到下解析,记录写入的顺序很重要。
这也适用于多对多关系,其中两个类通过第三个类相互关联。例如,文章
可以有很多作者
,以及作者
可以有很多文章
.你通常使用ArticleAuthor
类,对应于article_author
带有article_id
和一个author_id
列。清单16-17展示了如何编写一个fixture文件来定义这个模型的多对多关系。注意这里使用的复数表名——这是触发搜索中产阶级的原因。
清单16-17 -将记录添加到由多对多关系关联的表中,在数据/夹具/ import_data.yml
作者:first_author: name: John Doe article_authors: [first_post, second_post]
一个数据文件可以包含多个类的声明。但是,如果需要为许多不同的表插入大量数据,那么fixture文件可能会太长而不容易操作。
的推动:数据加载
方法中找到的所有文件设备/
目录,因此没有什么可以阻止您将YAML fixture文件分割成更小的部分。要记住的重要一点是,外键对表施加了一个处理顺序。为了确保它们以正确的顺序进行解析,请给文件加上序数前缀。
100 _article_import_data。yml 200 _comment_import_data。300年yml _rating_import_data.yml
请注意
Doctrine不需要特定的文件名,因为它会自动按照正确的顺序执行SQL语句。
部署应用程序
ob娱乐下载Symfony提供了简化命令来同步一个网站的两个版本。这些命令主要用于将网站从开发服务器部署到连接到Internet的最终主机。
使用rsync
用于增量文件传输
对于第一次传输,通过FTP发送根项目目录是很好的,但是当您需要上传应用程序的更新时,只有少数文件更改了,FTP就不理想了。您需要重新传输整个项目,这是浪费时间和带宽,或者浏览到您知道某些文件更改的目录,只传输修改日期不同的文件。这是一项耗时的工作,而且容易出错。此外,在转账期间,网站可能不可用或有bug。
symfony支持的解决方案是通过SSH层进行rsync同步。ob娱乐下载Rsync是一个命令行实用程序,提供快速增量文件传输,并且它是开源的。使用增量传输,只发送修改后的数据。如果一个文件没有改变,它就不会被发送到主机。如果文件只修改了部分,则只发送差值部分。rsync同步的主要优点是只传输少量的数据,而且速度非常快。
ob娱乐下载Symfony在rsync的基础上增加了SSH来保证数据传输的安全。越来越多的商业主机支持SSH隧道来保护其服务器上的文件上传,这是一种避免安全漏洞的良好实践。
symfony调用的SSH客户端使用ob娱乐下载配置/ properties.ini
文件。清单16-18给出了生产服务器的连接设置示例。在进行任何同步之前,将您自己的生产服务器的设置写入此文件。您还可以定义一个参数设置来提供您自己的rsync命令行参数。
清单16-18 -服务器同步的连接设置示例,在myproject / config / properties.ini
Name =myproject [production] host=myapp.example.com port=22 user=myuser dir=/home/myaccount/myproject/
请注意
方法中定义的主机服务器,不要混淆生产服务器properties.ini
项目的文件)与生产环境(生产中使用的前端控制器和配置,如应用程序的配置文件中所述)。
通过SSH执行rsync需要几个命令,在应用程序的生命周期中,同步可能会发生很多次。幸运的是,symfony只ob娱乐下载用一个命令就自动完成了这个过程:
symfonob娱乐下载y项目:部署生产
该命令启动rsync
干模式下的命令;也就是说,它显示了哪些文件必须同步,但实际上并不同步它们。方法来显式地请求同步——去
选择。
$ PHP ob娱乐下载symfony项目:部署生产—启动
同步完成后,不要忘记清除生产服务器中的缓存。
提示
在将应用程序部署到生产服务器之前,最好先使用check_configuration.php
.此实用程序可以在数据/ bin
symfony文件夹ob娱乐下载。它根据symfony需求检查您的环境。ob娱乐下载你可以在任何地方启动它:
$ PHP /path/to/ob娱乐下载symfony/data/bin/check_configuration.php
即使你可以从命令行使用这个实用程序,强烈建议从web上启动它,在你的web根目录下复制它,因为PHP可以使用不同的工具php . ini
命令行界面和web的配置文件。
侧边栏
你的申请完成了吗?
在将应用程序发送到生产环境之前,您应该确保它已经准备好供公众使用。在真正决定部署应用程序之前,请检查以下项目:
错误页面应该根据应用程序的外观进行定制。请参阅第19章,了解如何自定义错误500、错误404和安全页面;请参阅本章的“管理生产应用程序”部分,了解如何自定义当站点不可用时显示的页面。
的默认的
模块应该从enabled_modules
数组中的settings.yml
,这样就不会错误地出现syob娱乐下载mfony页面。
会话处理机制在客户端使用一个cookie,这个cookie被调用ob娱乐下载
默认情况下。在部署应用程序之前,您可能应该重命名它,以避免暴露应用程序使用symfony的事实。ob娱乐下载方法中自定义cookie名称,请参阅第6章factories.yml
文件。
的robots . txt
文件,位于项目的web /
目录,默认为空。你应该自定义它,以通知网络蜘蛛和其他网络机器人,他们可以浏览网站的哪些部分,他们应该避免哪些部分。大多数情况下,这个文件用于排除某些URL空间被索引——例如,资源密集型页面、不需要索引的页面(比如bug存档),或者机器人可能被困在其中的无限URL空间。
现代浏览器要求favicon.ico
文件,在地址栏和书签文件夹中用图标表示应用程序。提供这样一个文件不仅可以使您的应用程序看起来完整,而且还可以防止服务器日志中出现大量404错误。
忽略无关文件
如果您将symfony项目与生产主机同步,那么一ob娱乐下载些文件和目录不应该被传输:
- 所有版本控制目录(
. svn /
,CVS /
等等),它们的内容仅是开发和集成所必需的。 - 开发环境的前端控制器必须对最终用户不可用。当通过这个前端控制器使用应用程序时,可用的调试和日志工具会减慢应用程序的运行速度,并提供有关操作的核心变量的信息。这是一种远离公众的东西。
- 的
缓存/
而且日志/
每次同步时,不能在主机服务器上擦除项目的目录。这些目录也必须被忽略。如果你有数据/
目录,它可能应该以同样的方式对待。 - 用户上传的文件不能被传输。symfony项目的一个良好实践是将上传的文件存储在ob娱乐下载
web /上传/
目录中。这允许您通过只指向一个目录来从同步中排除所有这些文件。
若要从rsync同步中排除文件,请打开并编辑rsync_exclude.txt
在myproject / config /
目录中。每行可以包含一个文件、一个目录或一个模式。symfob娱乐下载ony文件结构是按逻辑组织的,并被设计为最小化要从同步中手动排除的文件或目录的数量。示例请参见清单16-19。
清单16-19 - rsync排除设置示例,在myproject / config / rsync_exclude.txt
#项目文件/cache/* /log/* /web/*_dev.php /web/uploads/* # SCM文件。arch-params .bzr _darcs .git .hg .monotone .svn CVS . conf . zip
请注意
的缓存/
而且日志/
目录不能与开发服务器同步,但它们至少必须存在于生产服务器中。如果myproject的/
项目树结构不包含它们。
管理生产应用程序
在生产服务器中最常用的命令是缓存:清晰
.您必须在每次升级symfony或项目时运行它(例如,在调用ob娱乐下载项目:部署
任务),以及每次在生产中更改配置时。
$ PHP ob娱乐下载symfony缓存:清除
提示
命令行界面在生产服务器中不可用,仍然可以手动清除缓存缓存/
文件夹中。
您可以暂时禁用应用程序——例如,当您需要升级库或大量数据时。
$ php ob娱乐下载symfony项目:禁用APPLICATION_NAME ENVIRONMENT_NAME
默认情况下,禁用的应用程序将显示sfConfig:获得(sf_symob娱乐下载fony_lib_dir) /异常/数据/ unavailable.php
但如果你自己创建unavailable.php
文件在你的项目配置/
目录,symfony将ob娱乐下载使用它代替。
的项目:启用
任务重新启用应用程序并清除缓存。
$ php ob娱乐下载symfony项目:启用APPLICATION_NAME ENVIRONMENT_NAME
谨慎
项目:禁用
目前没有影响,如果check_lock
参数未设置为真正的
在settings.yml。
侧边栏
清除缓存时显示不可用的页面
如果你设置check_lock
参数真正的
在settings.yml
文件,symob娱乐下载fony将在缓存被清除时锁定应用程序,然后在缓存最终被清除之前到达的所有请求将被重定向到一个页面,该页面表示应用程序暂时不可用。如果缓存很大,清除缓存的延迟可能会超过几毫秒,如果站点的流量很大,建议设置此值。此不可用页面与调用symfony时显示的页面相同ob娱乐下载禁用
的任务。的check_lock
参数在默认情况下是禁用的,因为它对性能有很小的负面影响。
的项目:clear-controllers
任务清除web /
除生产环境中运行的控制器外,所有控制器的目录。控件中不包括开发前端控制器rsync_exclude.txt
文件,此命令保证后门程序不会泄露应用程序的内部信息。
$ PHP ob娱乐下载symfony项目:清除控制器
如果使用SVN存储库中的签出,则可能破坏项目文件和目录的权限。的项目:权限
任务修复目录权限,以更改日志/
而且缓存/
例如,0777的权限(这些目录需要是可写的,框架才能正确工作)。
$ PHP ob娱乐下载symfony项目:权限
总结
通过组合PHP日志和symfony日志,可以轻松地监ob娱乐下载视和调试应用程序。在开发过程中,调试模式、异常和web调试工具栏可以帮助您定位问题。您甚至可以在日志文件或工具栏中插入自定义消息,以便于调试。
命令行界面提供了大量工具,可以在开发和生产阶段方便地管理应用程序。其中,数据填充和同步任务非常节省时间。
本作品在GFDL许可下获得许可。