如果您使用过 php,您就会发现它是创建特性丰富的 Web 页面的出色工具。作为一大脚本语言,PHP:
容易学习。
有许多强大的框架(比如 CakePHP 和 CodeIgniter),让您能够像 Rails 程序员一样高效。
能够与 mysql、PostgreSQL、Microsoft® sql server,甚至 oracle 通信。
但有时候,您想做更多的事情,或必须做更多的事情。我的意思是您必须直接与 PHP 运行的服务器的文件系统打交道。您最终需要处理文件系统上的文件,了解运行的进程或执行其他任务。
首先,您对在 PHP 使用 file() 命令打开文件很满意。但是在某种程度上,完成某些事情的唯一途径是在服务器上运行 shell 命令并获得特定的输出。例如,您可能想知道特定目录包含多少个文件。或者您想知道向某组日志文件写了多少行内容。或者您想操作这些文件,将它们复制到另一个目录,或使用 rsync 将它们发送到另一个位置。
在 "PHP 命令行?是的,您可以!" 这篇文章中,Roger McCoy 演示了如何从命令行直接使用 PHP —— 不需任何 Web 浏览器。在这篇文章中,我从另一个角度看待相同的主题,向您展示如何紧密地与底层 shell 命令集成,以及将返回值包含到您的界面和进程中。
仅当您运行在 Linux®、Berkeley Software Distribution (BSD) 或一些其他 UNIX® 版本上时,这些操作才有效。我假设您运行在 Linux-Apache-MySQL-PHP (LAMP) 堆栈上。如果您运行其他版本的 UNIX,具体细节可能不同,因为在每个版本中命令行的可用性都不同。我知道很多人还在 Mac OS X(运行某个版本的 BSD)从事开发,因此我尽量保持示例命令的通用性,确保移植方便。
命令行概述
PHP Command Line Interface (CLI) Server Application Programming Interface (SAPI) 在 PHP V4.2.0 开始发布,用于试验目的。到 V4.3.0 时,已经受到完整支持并且默认启用。PHP CLI SAPI 允许您开发 PHP 支持的 shell 脚本,甚至是基于桌面的脚本。事实上,可以用 PHP 创建可直接从命令行运行的工具。采用这种方式,PHP 开发人员可以像 Perl、AWK、Ruby 或 shell 程序员一样高效。
本文探究构建到 PHP 中的工具,让您了解 PHP 运行的底层 shell 环境和文件系统。PHP 为执行外部命令提供大量函数,其中包括 shell_exec()、exec()、passthru() 和 system()。这些命令是相似的,但为您运行的外部程序提供不同的界面。所有这些命令都衍生一个子进程,用于运行您指定的命令或脚本,并且每个子进程会在命令输出写到标准输出 (stdout) 时捕捉它们。
shell_exec()
shell_exec() 命令行实际上仅是反撇号 (`) 操作符的变体。如果您编写过 shell 或 Perl 脚本,您就知道可以在反撇号操作符内部捕捉其他命令的输出。例如,清单 1 显示了如何使用反撇号在当前目录中获取每个文本(.txt)的单词计数。
清单 1. 使用反撇号计算单词数量
#! /bin/sh number_of_words=`wc -w *.txt` echo $number_of_words #result would be something like: #165 readme.txt 388 results.txt 588 summary.txt #and so on.... |
在您的 PHP 脚本中,您可以在 shell_exec() 中运行这个简单的命令,如清单 2 所示,并获取想要的结果。这里假设在同一个目录下有一些文本文件。
清单 2. 在 shell_exec() 中运行相同的命令
<?php $results = shell_exec('wc -w *.txt'); echo $results; ?> |
在图 1 中可以看到,获得的结果与从 shell 脚本得到的一样。这是因为 shell_exec() 允许您通过 shell 运行外部程序,然后以字符串的形式返回结果。
图 1. 通过 shell_exec() 运行 shell 命令的结果
注意,仅使用后撇号操作符也会得到相同的结果,如下所示。
清单 3. 仅使用后撇号操作符
<?php $results = `wc -w *.txt`; echo $results; ?> |
清单 4 给出了一种更加简单的方法。
清单 4. 更加简单的方法
<?php echo `wc -w *.txt`; ?> |
通过 UNIX 命令行和 shell 脚本能够完成很多东西,知道这点很重要。例如,您可以使用竖线将命令连接起来。您甚至可以使用操作符在其中创建 shell 脚本,并且仅调用 shell 脚本(根据需要使用或不使用参数)。
例如,如果您仅希望计算该目录下的前 5 个文本文件的单词数,那么可以使用竖线 (|) 将 wc 和 head 命令连接起来。另外,您还可以将输出结果放到 pre 标记内部,让它能够更美观地呈现在 Web 浏览器中,如下所示。
清单 5. 更加复杂的 shell 命令
<?php $results = shell_exec('wc -w *.txt | head -5'); echo "<pre>".$results . "</pre>"; ?> |
图 2 演示了运行清单 5 的脚本得到的结果。
图 2. 从 shell_exec() 运行更复杂的 shell 命令得到的结果
在本文的后面部分,您将学习如何使用 PHP 为这些脚本传递参数。现在您可以将它看作运行 shell 命令的一种方法,但要记住您只能看到标准输出。如果命令或脚本出现错误,您将看不到标准的错误 (stderr),除非您通过竖线将它添加到 stdout。
passthru()
passthru() 允许您运行外部程序,并在屏幕上显示结果。您不需要使用 echo 或 return 来查看结果;它们会显示在浏览器上。您可以添加可选的参数,即保存从外部程序返回的代码的变量,比如表示成功的 0,这为调试提供更好的机制。
在清单 6 中,我使用 passthru() 命令运行在前面小节运行的单词计数脚本。如您所见,我还添加一个包含返回代码的 $returnval 变量。
清单 6. 使用 passthru() 命令运行单词计数脚本
<?php passthru('wc -w *.txt | head -5',$returnval); echo "<hr/>".$returnval; ?> |
注意,我不需要使用 echo 返回任何东西。结果会直接显示在屏幕上,如下所示。
#p#副标题#e#
图 3. 使用 return 代码运行 passthru() 命令的结果
在清单 7 中,我通过删除脚本头部的 5 前面的短横线 (-) 引入一个小错误。
清单 7. 在单词计数脚本中引入一个错误
<?php //we introduce an error below (removing - from the head command) passthru('wc -w *.txt | head 5',$returnval); echo "<hr/>".$returnval; ?> |
注意,脚本未能按照预期运行。您得到的是一个空白的屏幕
关键词标签:php
相关阅读 php出现Cannot modify header information问题的解决方法大全WIN2003 IIS6.0+PHP+ASP+MYSQL优化配置如何用PHP和mysql创建一个ShoutBoxMySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法PHP上传(文件,图片)类PHP中$_SERVER的详细用法
热门文章 plsql developer怎么连接数据库-plsql deve2021年最好用的10款php开发工具推荐在 PHP 中使用命令行工具php应用程序安全防范技术研究
时间:10-12
时间:12-28
时间:12-19
时间:12-20
时间:12-28
时间:09-28
人气排行 详解ucenter原理及第三方应用程序整合思路、方法PHP中防止SQL注入攻击PHP会话Session的具体使用方法解析PHP运行出现Notice : Use of undefined constant 的解决办法CakePHP程序员必须知道的21条技巧PHP如何清空mySQL数据库PHP采集图片实例(PHP采集)plsql developer怎么连接数据库-plsql developer连接数据库方法
查看所有0条评论>>