用 syslog 改进和调试 PHP 应用程序

用 syslog 改进和调试 PHP 应用程序

PHP 版古老 UNIX syslog 提供了简单有效的调试工具php

William B. Zimmerly ( bill@zimmerly.com), 自由撰稿人和知识工程师, 自由撰稿人

简介: 探索正在运行中的程序的一种老技术是在策略点上放置代码,显示变量当前值。可是如何完成此操做而不干扰程序的标准输出呢?使用 PHP 的 syslog() 工具,能够很是容易检验这些值。阅读本文了解如何操做。html

本文的标签:  php_(hypertext_preprocessor), 调试程序员

发布日期: 2007 年 10 月 16 日
级别: 中级
访问状况 558 次浏览
建议: 0 (添加评论) 数据库

1 star 2 stars 3 stars 4 stars 5 stars 平均分 (共 1 个评分 )

用计算机编程是一件单调乏味的事情,可是它也颇有趣。编程有趣的一面在于了解使用旧工具的新方法。最近,我签了一份合同帮助解决基于 Linux®、Apache、MySQL 和 Linux、Apache、MySQL、PHP/Perl (LAMP) 的大型复杂内容管理系统 (CMS) 中的若干个错误。该 CMS 的架构是标准的 LAMP 模型,使用运行 Apache V2.0 的 Enterprise Red Hat Linux。驱动 Web 站点的代码由分布在 Apache 文档根目录的 30 个子目录中的几百个 PHP 源模块组成。系统的 Apache 和 MySQL 部分不须要更改,由于个人全部纠错操做都是在 PHP 工做区中进行的。apache

请访问 PHP 技术资源中心,获取有关 PHP 的信息,包括大量 PHP 技术文章、教程、下载和相关技术资源。 编程

RSS 订阅 PHP 相关文章和教程的 RSS 提要

在研究了该 CMS 的工做原理一段时间以后,我渐渐开始欣赏该系统优雅的设计而且意识到在大多数成熟的编程环境中,此系统只依赖于少许的可用 PHP 函数(在这里想起了旧的 80/20 法则,其中 80% 的工做是用 20% 的可用函数来完成的)。本文将展现如何调试未知的复杂系统,以帮助您了解那些不多使用的函数,并提供如何使用 syslog() 函数的丰富功能来应用新知识的示例。浏览器

调试程序安全

虽然表面上 PHP 编程语言有成百上千个函数可用,可是在读到与本文相似的文章以前,您可能从未使用过某些函数(或许大多数函数)。另外一种深刻学习语言的方法是调试别人已经用该语言编写的程序。我老是对程序员用具备创造性的方法使用工具印象深入。服务器

调试像计算机编程同样,一半是科学,一半是艺术。在不是由您建立的系统中跟踪并不明显的错误时,须要可以很快地定位这些错误在代码中的位置。因为要处理的代码模块有成百上千个,所以最佳起点是显示找到错误的输出位置,而后从该位置开始逆向查找来隔离问题。网络

例如,若是知道输出的计算值不正确,则必须设计一种方法来查看致使出现问题的中间值。经过重要的数据库查询获得的错误数据能够证实存在其余问题。您必须可以查看生成(并由代码提交给 MySQL 引擎)的 SQL 语句以查看问题是否是出在语句里。

完成此操做的一项古老技术是插入能够打印这些字符串和值的代码。不幸的是,使用诸如 PHP 之类的工具或任何基于 Web 的应用程序,您不但愿在这样的系统固有输出(即,被发送给浏览器的 HTML 代码)中掺入调试信息,尤为是在要检验的系统是一台生产服务器时。

您能够建立自定义日志记录文件并向其中写入日志消息,可是为何不使用已经提供给您的工具呢?请始终记住:不要把工具尘封 起来。您值得花一些时间查看语言建立者是否已经提供了一种库例程或函数,能够执行您一般须要的功能。实际上,只要您以为某些内容很明显应当是编程包的一部 分,那么它极可能就包含在其中。

我意识到须要使用相似于 UNIX® 的 syslog 的工具。我想 PHP 颇有可能有 syslog 功能,所以在快速查看了 PHP 文档后,我找到了它!PHP syslog() 函数是我多年来没注意到的函数,直到我签约来作这个项目。使用 syslog(),我能够搜索直至找到并消除生产系统中的大多数错误,除了须要几分钟时间执行各个函数以外,不会引入其余反作用。

随着知识的积累而且在专业领域中愈来愈有经验,显然能够采用不一样的方法来作事情,而且某种方法将最终成为执行必要任务的首选方法。必须始终牢记的是您认为很明显的事情对其余人来讲并不必定是明显的。对您来讲很简单的事情对于其余人来讲可能很是复杂。

使用诸如 syslog() 函数之类的工具能够控制复杂度,并容许经过配置文件(例如 syslog.conf)来轻松地进行自定义。例如,能够插入代码来设定 SQL 语句的格式,将它记录到 syslog() 中并将其传递给 MySQL 来执行。随后,对 syslog.conf 文件稍微修改一下,把文本发送给另外一个日志文件或者可能就发送给位桶(bit bucket)。几个星期或几个月以后,若是有必要再次查看发生的状况,则再对 syslog.conf 文件进行简单更改将还原该功能。

syslog

syslog 在 UNIX 世界中有着丰富多彩的历史。syslog 最初是做为 Sendmail 项目的一部分开发的,实践证实它很是有用,所以许多其余工具引入了 syslog 功能,证实了最简单的想法有时最有效。

简要地说,syslog 容许应用程序将带有标记的消息写入一组公共系统日志文件中,这些日志文件能够驻留在程序员和网络管理员可以轻松访问的位置。这意味着,例如,您能够配置 Web 服务器上的 syslog 以记录另外一台服务器上的系统消息 —— 这台服务器多是在安全防火墙后面几层而且更易于让前述管理员访问。可是按照个人目的,我只接受将文件写入 /var/log 目录的默认行为。

syslog 机制是在启动时启动的,而且其初始行为是由 syslog.conf 文件中的规则定义的。这些规则使您能够很好地调整使用该机制记录的内容 —— 在一台高容量并且工做繁重的服务器上使用 syslog 机制能够转换为可改变大小的日志文件。

每条规则都包含两个字段:selectoraction。基本上,selector 字段选择要记录的工具(例如,kern、user、mail、lpr)和工具拥有的优先级。优先级字段包含一个关键字,例如 debug、info、notice 或者 warning。而规则的 action 字段用于定义对匹配 selector 字段的那类消息执行的操做。规则能够指定记录消息的文件,将记录消息发送给哪台计算机,将消息发送给什么用户(以控制台消息的形式)等。

日志记录

研究与 syslog 工具相关的信息和手册页以了解如何根据须要配置系统。在个人例子中,我须要知道在生产 CMS 系统每次运行时各个 PHP 变量的值是什么。我还须要知道某些模块什么时候启动及什么时候中止以及各个中间变量值。在说明须要记录哪些信息的细节以前,让咱们先来设置日志的基本信息。

使用您最喜欢用的编辑器,建立清单 1 中所示的文件,将其命名为 test.php 并把它放在 Apache 文档根目录中(在个人系统中,它是 /var/www)。


清单 1. test.php
<html>
  <head>
    <title>PHP Test Page</title>
  </head>
  <body>
    <?php
  syslog(LOG_NOTICE, "{$_SERVER['REMOTE_ADDR']}: test.php - PHP Index page accessed.");
  echo '<p>PHP Test Page</p>';
    ?>
  </body>
</html>

您一样应当安装并配置了 PHP。若是没有,请查看 参考资料 以得到介绍如何安装和配置的连接。若是一切配置正确,那么当您访问 URL 为 http://localhost/test.php 的页面时应当会在浏览器中看到如下文本:

PHP Test Page

接下来,打开一个 X 终端窗口并键入如下命令来查看记录到 /var/log/messages 文件中的内容:

tail /var/log/messages

若是一切运行正常,您应当会在接近清单末尾的位置看到下面一行:

Jul 23 14:43:42 localhost apache2: 127.0.0.1: test.php - PHP Index page accessed.

若是您看到了,那很好。您如今已经准备好开始详细调试所使用的复杂系统。

我发现了一个优秀实践:对全部 PHP/MySQL 调用使用 syslog(),这样每次都与 Web 站点交互,能够看到实时生成了哪些 SQL 查询以构建返回给您的页面。一种简单的实现方法是打开另外一个 X 终端窗口并结合使用 tail 命令与 -f 选项来 “实时” 查看消息日志:

tail -f /var/log/messages

记录的内容

如今您已经检验了日志能够正常工做而且能够看到记录机制的结果,下面的提示介绍了如何使用这些工具尽量快速地缩短学习陌生系统的过程。

必须知道哪些模块执行了超出其文档所述范围的操做。因为这个缘由,我喜欢记录标记模块开头和结尾的日志消息。这样,您能够对 Web 站点的页面进行操做,同时监视运行 tail -f /var/log/messages 命令的另外一个 X 终端窗口。这样能够看到哪些模块在执行而且浏览器每次请求新页面时的顺序。

我还须要记录在 PHP 代码运行期间被调用的各个程序之间的边界。例如,查询数据库时调用 MySQL,或者修改数据格式时调用外部程序(例如,Extensible Stylesheet Language Transformation(XSLT)引擎)。系统地把这些检查点插入每一个 PHP 代码模块中,这种实践将帮助您熟悉模块的名称和位置。当浏览各个页面时代码把您在另外一个 X 终端中看到的消息发送给您时,您将得到推进和加强系统知识的重要反馈。

结束语

syslog 工具是调试由其余人编写的应用程序的强大工具。它容许您查看哪些模块正被执行,哪些 SQL 语句正在执行,以及在您浏览 Web 站点时哪些变量值发生更改。这有助于查找可能会发生问题的模块。


参考资料

学习

  • 您能够参阅本文在 developerWorks 全球站点上的 英文原文

  • 了解关于 syslog() 函数的更多信息。

  • 在 Wikipedia 中探索 syslog 的历史

  • PHP.net 是 PHP 开发者的重要资源。

  • 查看 “PHP 推荐读物列表”。

  • 浏览 developerWorks 上的所有 PHP 文章PHP 教程

  • 查看 IBM developerWorks 的 PHP 项目资源 以扩展 PHP 技巧。

  • 收听针对软件开发人员的有趣访谈和讨论,必定要访问 developerWorks podcast

  • 要将数据库与 PHP 结合使用?查看 Zend Core for IBM,它是一个无缝的、能够当即使用、易于安装、支持 IBM DB2 V9 的 PHP 开发和生产环境。

  • 随时关注 developerWorks 的 技术事件和网络广播

  • 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其余 活动

  • 访问 developerWorks 开放源码专区,得到丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。

  • 查看免费的 developerWorks On demand demo 观看并了解 IBM 及开源技术和产品功能。

得到产品和技术

  • 使用 IBM 试用软件 改进您的下一个开发项目,这些软件能够经过下载或从 DVD 中得到。

  • 下载 IBM 产品评估版,并开始使用 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

讨论

关于做者

Bill Zimmerly 的照片

Bill Zimmerly 是一名知识工程师和专长于不一样版本 UNIX® 和 Microsoft® Windows® 软件的底层系统程序员,同时他也是一名崇尚逻辑至上的自由思想者。他热衷于建立新技术并撰写相关的文章。他住在 Missouri 的 Hillsboro 郊外,那里空气新鲜、景色怡人,处处都有上等的葡萄酒厂。

相关文章
相关标签/搜索