PHP开发工具为程序员带来高质量代码

作为一个PHP程序员来说,手里都会有那么几款适合自己的PHP开发工具,帮助自己完成程序开发。今天我们就向大家介绍几款程序员们必不可少的工具在参与了几个大型PHP项目,写了很多PHP代码以后,我发现很多工具可以提高代码质量,简化发布,使得做为PHP开发人员的生涯变得轻松许多。

 
许多这样的工具可能已经为大家所用。但是,由于一些人甚至没有注意到这些工具的存在,我会从此开始,好了,不说废话,下面是我认为所有PHP程序员应该知道的PHP开发工具列表。
 

Phing – 一个项目构建系统

Phing 是一个基于Apache ANT 的项目构建系统。它的名字是一个拗口的语句首字母缩写 – PHing Is Not GNU make 。Phing可以做传统构建系统比如 GNU make 能做的任何事情,同时没有陡峭的学习曲线。

在phing(以及其他的构建系统)背后的思想是评估一系列相关性,然后执行一系列PHP类去正确的安装和配置一个应用系统。构建过程用一个简单的 XML配置文件控制。Out of the box, phing内置可以执行一系列替换(比如:在你的开发版本和产品版本间改变include路径)、执行SQL语句、移动和复制文件、运行外部脚本等等。通 过扩展包含在发行包中的“task”类,你也可以创造自己的定制任务。

对任何需要在超过一台服务器上部署大型PHP应用的人来世,Phing是一个无价之宝。同时我发现它对简单的PHP脚本也是很有用的。

 
 

Xdebug – 调试和分析的PHP开发工具

Xdebug 是帮助你调试和分析脚本的一个PHP扩展。Xdebug中最有用的特性是在激活后显示的新注意信息、警告信息和错误信息。如果一个脚本不能正常运 行,Xdebug将会输出关于错误信息的完整堆跟踪 ,会附带函数名称、参数值、源文件和行号。这对于厌倦了PHP默认只带的可怜的错误报告功能的程序员是一个值得欢迎的特性。

这个扩展有很多更先进的功能,允许开发人员进行代码覆盖率分析,收集分析信息以及交互式地调试脚本。profiling functionality 功能尤其有用。分析器使用一个普通的输出文件格式,允许你使用象 KCacheGrind 这样的工具快速发现你代码中的瓶颈。对任何严肃的开发人员而言,一个好的分析器是基本工具,它使得你妥善优化你的代码,同时避免过早优化带来的危害。

 
 

PHPUnit – 单元测试框架

PHPUnit 是一个轻量级的PHP测试框架。它是在PHP5下面的 JUnit 3.8.1 完整移植,是xUnit 测试框架家族的一员(它们基于软件模式 先锋 Kent Beck 的设计)。

单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以被前面讨论的Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试。

 
 

Propel – ORM(对象关系映射)框架

Propel是一个PHP5下面的对象关系映射(ORM)框架,它起源于Apache Torque项目。它提供了一个复杂但是易用的数据库抽象层,使得你可以在PHP中象使用普通类和对象一样得使用数据库实体。Propel允许你使用一种 简单的XML格式定义你的数据库,这个XML文件被用来映射数据库,生成应用中使用的静态类。

Propel被内嵌于流行的Symfony PHP框架 (还有其他的),它使得代码更灵活、模块化以及可移植。这个项目有The project has 出色的文档,以及很棒的支持社区。

phpMyAdmin / phpPgAdmin – 基于web的数据库管理系统

历史有点长可是还是很有用,是对于任何数据库(对应PostgreSQL和SQLite是 和 )最有用的管理工具之一。它有助于做每一件事情 – 从为了调试应用去创建和删除数据库到做备份。安装它通常是我在一个LAMP服务器上面安装完 Apache, PHP和MySQL后做的第一件事情。如果你使用MySQL,不知何故还没听说过它,那么现在就安装 。phpSQLiteAdminphpPgAdminphpMyAdmin

 
 

其他PHP开发工具

还有很多优秀的工具用以符合各种需要,帮助PHP开发者创建一个丰富的开发环境 — 我希望我可以说到所有这些工具。我发现对自己有用的工具有PHP Beautifier, Spyc, Creole和Smarty。我确信还有很多我忘记或者没听说过的有用工具。因此,如果你知道某个我遗漏的PHP开发伟大工具,请留言让我(以及所有人) 知道!

利用PHP操作Linux消息队列完成进程间通信

当我们开发的系统需要使用多进程方式运行时,进程间通信便成了至关重要的环节。消息队列(message queue)是Linux系统进程间通信的一种方式。

关于Linux系统进程通信的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/

关于Linux系统消息队列的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
 
PHP的sysvmsg模块是对Linux系统支持的System V IPC中的System V消息队列函数族的封装。我们需要利用sysvmsg模块提供的函数来进进程间通信。先来看一段示例代码_1:

  1. <?php  
  2.   
  3. $message_queue_key = ftok(__FILE__‘a’);  
  4.   
  5. $message_queue = msg_get_queue($message_queue_key, 0666);  
  6. var_dump($message_queue);  
  7.   
  8. $message_queue_status = msg_stat_queue($message_queue);  
  9. print_r($message_queue_status);  
  10.   
  11. //向消息队列中写  
  12. msg_send($message_queue, 1, “Hello,World!”);  
  13.   
  14. $message_queue_status = msg_stat_queue($message_queue);  
  15. print_r($message_queue_status);  
  16.   
  17. //从消息队列中读  
  18. msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);  
  19. print_r($message.“\r\n”);  
  20.   
  21. msg_remove_queue($message_queue);  
  22.   
  23. ?>   

 

这段代码的运行结果如下:

  1. resource(4) of type (sysvmsg queue)  
  2. Array  
  3. (  
  4.     [msg_perm.uid] => 1000  
  5.     [msg_perm.gid] => 1000  
  6.     [msg_perm.mode] => 438  
  7.     [msg_stime] => 0  
  8.     [msg_rtime] => 0  
  9.     [msg_ctime] => 1279849495  
  10.     [msg_qnum] => 0  
  11.     [msg_qbytes] => 16384  
  12.     [msg_lspid] => 0  
  13.     [msg_lrpid] => 0  
  14. )  
  15. Array  
  16. (  
  17.     [msg_perm.uid] => 1000  
  18.     [msg_perm.gid] => 1000  
  19.     [msg_perm.mode] => 438  
  20.     [msg_stime] => 1279849495  
  21.     [msg_rtime] => 0  
  22.     [msg_ctime] => 1279849495  
  23.     [msg_qnum] => 1  
  24.     [msg_qbytes] => 16384  
  25.     [msg_lspid] => 2184  
  26.     [msg_lrpid] => 0  
  27. )  
  28. Hello,World! 

 

可以看到已成功从消息队列中读取“Hello,World!”字符串

下面列举一下示例代码中的主要函数:

  1. ftok ( string $pathname , string $proj )   
  2.     手册上给出的解释是:Convert a pathname and a project identifier to a System V IPC key。这个函数返回的键值唯一对应linux系统中一个消息队列。在获得消息队列的引用之前都需要调用这个函数。  
  3.   
  4. msg_get_queue ( int $key [, int $perms ] )  
  5.     msg_get_queue()会根据传入的键值返回一个消息队列的引用。如果linux系统中没有消息队列与键值对应,msg_get_queue()将会创建一个新的消息队列。函数的第二个参数需要传入一个int值,作为新创建的消息队列的权限值,默认为0666。这个权限值与linux命令chmod中使用的数值是同一个意思,因为在linux系统中一切皆是文件。  
  6.   
  7. msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize [, bool $blocking [, int &$errorcode ]]] )  
  8.     顾名思义,该函数用来向消息队列中写数据。  
  9.   
  10. msg_stat_queue ( resource $queue )   
  11.     这个函数会返回消息队列的元数据。消息队列元数据中的信息很完整,包括了消息队列中待读取的消息数、最后读写队列的进程ID等。示例代码在第8行调用该函数返回的数组中队列中待读取的消息数msg_qnum值为0。  
  12.   
  13. msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize [, int $flags [, int &$errorcode ]]] )   
  14.     msg_receive用于读取消息队列中的数据。  
  15.   
  16. msg_remove_queue ( resource $queue )   
  17.     msg_remove_queue用于销毁一个队列。 

 

示例代码_1只是展示了PHP操作消息队列函数的应用。下面的代码具体描述了进程间通信的场景

  1. <?php  
  2.   
  3. $message_queue_key = ftok(__FILE__‘a’);  
  4. $message_queue = msg_get_queue($message_queue_key, 0666);  
  5.   
  6. $pids = array();  
  7. for ($i = 0;  $i < 5; $i++) {  
  8.         //创建子进程  
  9.         $pids[$i] = pcntl_fork();  
  10.   
  11.         if ($pids[$i]) {  
  12.                 echo “No.$i child process was created, the pid is $pids[$i]\r\n”;  
  13.         } elseif ($pids[$i] == 0) {  
  14.                 $pid = posix_getpid();  
  15.                 echo “process.$pid is writing now\r\n”;  
  16.   
  17.                 msg_send($message_queue, 1, “this is process.$pid’s data\r\n”);  
  18.                 posix_kill($pid, SIGTERM);  
  19.         }  
  20. }  
  21.   
  22. do {  
  23.         msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);   
  24.         echo $message;  
  25.   
  26.         //需要判断队列是否为空,如果为空就退出  
  27.         //break;  
  28. while(true)  
  29.   
  30. ?> 

 

运行结果为:

  1. No.0 child process was created, the pid is 5249  
  2. No.1 child process was created, the pid is 5250  
  3. No.2 child process was created, the pid is 5251  
  4. No.3 child process was created, the pid is 5252  
  5. No.4 child process was created, the pid is 5253  
  6. process.5251 is writing now  
  7. this is process.5251’s data  
  8. process.5253 is writing now  
  9. process.5252 is writing now  
  10. process.5250 is writing now  
  11. this is process.5253’s data  
  12. this is process.5252’s data  
  13. this is process.5250’s data  
  14. process.5249 is writing now  
  15. this is process.5249’s data 

 

 

这段程序每次的运行结果都会不同,这正说明了多进程的异步性。从结果也能看出消息队列FIFO特性。

以上便是我研究的一点心得。接下来将会继续研究PHP利用信号、socket等进行进程间通信的方法。