内容
当我们在应用程序上工作时,无论选择哪种语言,有时我们都可以将过多的精力放在代码本身上。一个真正好的开发生命周期远不只是代码,它提供了一系列支持工具来确保应用程序的质量和可靠性,既可以作为独立实体,也可以作为部署时的生命体。为此,本文着眼于创建更好的PHP应用程序的五个工具:PHP Code Sniffer,PHP Documentor,Supervisord,Phing和Uptime Robot,以密切关注您健壮而又新近部署的站点。
01. PHP代码嗅探器
这些工具中的第一个确实与代码非常接近,因为PHP Code Sniffer是一种用于检查代码是否符合给定编码标准的工具。它附带了自己的内置规则,或者您可以轻松地自己制定规则。使用PHP Code Sniffer意味着您可以检查项目在整个过程中的一致性和可读性。 PHP与空格无关,因此括号,换行和缩进的放置不会影响代码的解析和运行方式–那么,为什么要使用这样的工具呢?
实施编码标准意味着确保最低的合规性和可读性标准。这意味着您的整个项目都遵循某些准则,使其易于阅读和维护。考虑到平均每个Web应用程序在维护模式上花费的时间,这是一个非常重要的功能。
可通过PEAR获得PHP Code Sniffer,其项目页面在此处。假设您已经安装了PEAR(如果您不使用PEAR,然后检查一下,那里有一些出色的工具!),则可以使用以下命令进行安装:
梨安装PHP_CodeSniffer
安装后,您可以立即尝试根据已安装的标准之一检查项目的编码标准。要查看已安装的软件,请使用 phpcs -i 从命令行。我个人最喜欢的是Squiz标准,它不像PEAR那样严格,但仍然很全面。除非您的项目已采用编码标准,否则可能会有很多警告,因此我认为从生成摘要报告开始很有用。从包含项目代码的目录中运行以下命令:
phpcs --report = summary --standard = Squiz。
您会看到类似以下内容的输出:
处理并纠正各种警告需要花费一些时间,但是值得付出努力,提供清晰易读的代码,并注意我们作为开发人员创建的产品的质量。如果默认情况下捆绑的嗅探不满足您的需求,则可以创建自己的嗅探!有一些很好的文档可以做到这一点,而且这是一项非常容易完成的任务,尤其是当您乐于从现有的嗅探中“挑选和混合”时。
当PHP Code Sniffer是自动化构建过程的一部分时,它特别强大,从而可以持续不断地反馈符合编码标准的状态。我们稍后在查看Phing时将再次进行讨论。
02. PHP Documentor
在没有实际运行的情况下通过代码进行测量和生成工件的过程称为静态分析。 PHP Code Sniffer是静态分析工具的一个示例,而PHP Documentor是另一个。 PHP Documentor读取您的代码结构,文件系统结构,类,函数以及之间的所有内容,并从中生成文档。当您以特定的符号添加其他注释以添加有关代码各个元素的更多详细信息时,效果会更好。
PHP Documentor的安装是通过PEAR进行的,因此,它再次非常简单。但是,PHP Documentor运行自己的PEAR通道,因此需要两个命令来安装此工具:
梨频道-发现pear.phpdoc.org
梨安装phpdoc / phpDocumentor-alpha
安装完成后,您将拥有一个 phpdoc 您的命令行上可用的程序。告诉 phpdoc 用来记录哪个文件夹 -t 以及在何处写入输出文件 -d。您还可以自定义输出的格式及其使用的模板,因此可以在适当的情况下为自己的组织创建模板。
例如,请查看TimeZone类中的以下代码片段(来自Joind.in事件反馈网站,该网站是开源的,因此所有代码都在GitHub上):
php
/**
*类库,用于处理事件/对话的数据/时间问题
*
* PHP版本5
*
* @category Joined.in
* @软件包控制器
* @copyright 2009-2013 Joined.in
* @license http://github.com/joindin/joind.in/blob/master/doc/LICENSE JoindIn
* @link http://github.com/joindin/joind.in
*/
时区类
{
/**
*获取事件的当前时间,该事件具有时区偏移
* $ evt_offset小时
*
* @参数整数$ evt_offset时间的偏移量
*
* @返回整数
*/
公共静态函数getEventTime($ evt_offset)
{
$ here =新的DateTimeZone(date_default_timezone_get());
$ hoffset = $ here-> getOffset(new DateTime(“ now”,$ here));
$ off =(time()-$ hoffset)+($ evt_offset * 3600);
返回$ off;
}
/**
*返回getDatetimeFromUnixtime的格式化版本。
*
* @param integer $ unixtime Unix格式化时间
* @param string $ timezone要设置时间戳的时区
* @param string $ format返回的格式
*
* @返回字符串
*/
公共静态函数formattedEventDatetimeFromUnixtime(
$ unixtime,
$ timezone,
$格式
) {
$ datetime = static :: getDatetimeFromUnixtime($ unixtime,$ timezone);
$ retval = $ datetime-> format($ format);
返回$ retval;
}
}
将PHP Documentor应用于此代码段(实际类中的内容比上面显示的更多),结果是这样的:
即使在没有注释的项目上运行PHP Documentor,也仍然给项目结构以印象,并允许用户查看其中的内容。然后添加的所有注释将出现在输出中。该工具与已经提到的PHP Code Sniffer很好地结合在一起,因为许多PHP Code Sniffer标准都要求提供PHP Documentor注释。同样,此工具在定期且自动运行时效果最佳-通常是在隔夜或合并每次更改后重新生成API文档,以使它们保持最新状态并作为参考。
03.主管
Supervisord(发音为“ supervisor dee”)是在编写特定样式的应用程序之前不需要的工具之一,然后您将无法想象没有它的生活。 Web应用程序作为一组简单的代码开始其生命,这些代码用于处理对传入请求的响应。随着它们变得越来越复杂,还需要定期执行或响应特定事件的其他任务。那么,Supervisord有何帮助?
Supervisord负责长时间运行的流程。如果发生崩溃,Supervisord将尝试重新启动该过程;否则,将重新启动该过程。如果进程继续迅速消失,那么Supervisord将放弃。在我自己的系统上,通常可以在Supervisord下运行一些独立的操作:
- IRC机器人
- 从队列中提取作业的工作程序脚本
- PHP / node.js应用程序从命令行处理请求
Supervisord在大多数平台上都很容易安装(例如,通过我的Linux系统上的软件包管理器),并带有一个称为SupervisorCTL的控制面板。当我运行它时,我看到类似以下内容:
从中,您可以看到有一堆正在运行的进程(有些已停止)以及它们已经运行了多长时间(昨天我重新启动了服务器!)。该控制面板为我提供了一种检查方法,查看所有各种任务的记录输出以及停止,启动或重新启动工作程序的方法。长时间运行的过程可能难以监控,并且此工具使操作变得非常容易。一旦您的应用程序超出了投放网页的阶段,Supervisord就是您的朋友。
04.电话
Phing是一个与Ant相同的构建系统。这是一种非常简单,与平台无关的运行命令的方式,可以在项目中运行各种作业。许多项目使用它进行部署,但是它也可以为您执行许多其他任务,例如运行测试套件以及使用静态分析工具,例如本文中已经提到的PHP Documentor和PHP Code Sniffer。
Phing可通过PEAR获得,并具有自己的PEAR通道,因此您可以使用以下命令,按照与我们看到的其他基于PHP的工具相同的方式安装它:
梨通道-发现pear.phing.info
梨安装phing / phing
到达该位置后,您将在命令行中再次有一个新命令可用。 Phing读取用XML编写的构建文件(非常接近Ant语法,但不完全兼容),该文件可以指定多个“目标”或Phing知道如何运行的命令。这是一个小例子:
?xml版本=“ 1.0”编码=“ UTF-8”?>
项目名称=“ joindin” default =“ build” basedir =“。”>
目标名称=“ phpdoc” description =“使用PHPDocumentor生成API文档”>
phpdoc2 destdir =“ $ {basedir} / build / api”>
文件集dir =“ $ {source}” />
/ phpdoc2>
/ target>
目标名称=“ phplint” description =“在文件集上运行php -l”>
phplint haltonfailure =“ true”>
fileset dir =“ $ {source}”>
模式集>
包括名称=“ * * / *。php” />
/ patternset>
/ fileset>
/ phplint>
/ target>
目标名称=“内部版本”取决于=“ phpdoc,phplint” />
/项目>
这是来自Joined.in项目的摘录,来自 build.xml 文件,这是Phing的配置方式。如果我们依次考虑每个块,我们首先有一个项目标签,其中包含默认目标名称并设置 基础的 属性,以便可以在以后的元素中使用。在项目标签内,有一系列任务标签。这些是Phing能够运行的任务,并包含执行此任务所需的所有信息。最终目标是“建造”。这是该项目的默认目标,因此如果在不带参数的情况下运行Phing命令,则将运行该目标。该目标取决于另外两个目标,这意味着这些目标也将运行。
Phing提供清晰的命令行输出,并生成要存储在给定位置的工件(例如API文档),以便我们以后可以链接到它。从命令行运行以上命令,将得到如下输出:
输出看起来并不多,但是如果我们检查一下输出到构建目录中的内容,则API文档以及其他构建目标的工件都将完整存在:
Phing确实可以自行部署。可以将一系列任务添加到每个目标中,并将依次执行这些任务。 Phing支持各种任务(请查看其文档),包括处理版本控制的导出,压缩和传输文件以及通过SSH运行命令。
为项目的自动部署创建Phing目标是使潜在风险和复杂过程变得非常可靠的好方法。 Phing不会按照Wiki上的说明进行操作,而是执行使您的网站正常运行所需的所有步骤。不要忘记,这还可以包括通过Supervisord重新启动应用程序中的辅助脚本!
05.监视站点健康
网站上线后,很容易会认为工作已经完成,但是密切注意事情也非常有帮助。监视并不意味着等待您的客户振铃并告诉您他们的网站何时停止运行。取而代之的是,我们使用工具定期检查一切是否正常,如果不正常,请告知我们。
该区域有很多选项,但是我们将考虑两种监视:警报监视(可让您知道站点已关闭)和趋势监视(可为给定的测量值设置阈值)。警报监视是网站上非常基本的检查。如果站点在那里,一切都很好。如果网站没有回应,则会提醒您有问题。
最简单的监控设置可确定对给定URL的网络请求有成功的HTTP响应。如果没有响应,或收到错误响应,则该站点被认为是“已关闭”。如果应该通过电话或电子邮件进行操作,通常可以配置提供此类监视的服务来与您联系。这种类型的服务的提供者之一是Uptime Robot,它可以轻松监视站点并显示站点何时关闭。
使用此服务,我们还可以设置内容监视。这样可以检查响应中是否应该包含某些元素。这有助于在返回内容时(而不是预期的内容)(例如,当您看到来自Apache的“有效!”页面时)进行提取。它可以像某些文本一样简单,应显示在要监视的页面上。
有时您还会看到ping监视,但是一台机器很可能响应ping却无法成功提供HTTP响应。我更喜欢HTTP监视。
趋势监控着眼于更复杂的指标,并且通常包括在服务器本身上运行的工具。这可能会考虑Web服务器进程的数量,内存使用情况或页面的响应时间,并跟踪这些事件随时间的变化。监视工具将允许您设置阈值,如果特定数据段在给定的时间段内趋势过高或过低,则会以某种方式通知您。有时,这是对操作人员的传呼,有时,拐角处的仪表板屏幕会改变颜色;正确的响应完全取决于您的应用程序。
06.更好的工具
改善我们的工具和流程需要花费时间,有时还需要金钱。但是,好的工具可以使开发过程的每个部分平稳且可重复地运行,并在我们投入时间改进它们的过程中获得可观的回报。本文旨在包括一些您可能尚未使用的选择,但这些选择对于轻松的开发过程而言是一项资产。
Lorna是英国利兹的独立网络开发顾问,培训师和作家。她是PHP专家,并且与团队合作,以充分利用他们的应用程序,工具和人员。 Lorna是Joined.in开源项目的定期会议发言人和首席开发人员。