PHP 命令行?是的,您可以!(3)

为第一个 PHP 脚本制定一个简单的初始目标:创建一个能读入文件并打乱该文件中各行的脚本。如果要打乱 m3u 文件或类似内容,则使用此功能可能很便利。这样做意味着您必须能够从文件或标准输入读取数据并将数据写回终端。

这将出现 PHP 中的第一大挑战。PHP 最初不是设计用于与用户直接的键盘输入或文本输出结合使用。了解这一设计是至关重要的,因为如果需要在命令行中执行任何操作,都必须能够与用户来回通信。在诸如 C 之类的传统编程语言中,您将使用 STDIN、STDOUT 和 STDERR 完成此操作。您可以将 PHP 中的相同通道分别用于输入、标准输出和输出到错误通道。

STDOUT:echo、print、STDOUT 和 php://stdout

即使 PHP 设计用于输出到浏览器而不是输出到 CLI,从 PHP 创建输出也是非常简单的,它几乎不需要花太多时间思考。记住,PHP 标记外的任何内容都将被直接输出到 CLI,这就是上面的 HelloWorld 程序如此简单的原因。这也是为什么先输出上面的 Don<'t>code 后再输出错误消息的原因。您是否用 HTML 标记圈起文字都没有关系;因为不管怎样都会显示这些文字。事实上,您通常需要避免使用 HTML 标记,因为它们都将直接打印给用户。

您还可以使用基本函数进行输出。例如,echo 和 print 命令打印到标准输出。

#!/usr/bin/php -q Output #1. <?php echo "Output #2."; print "Output #3."?>  

这将得到:

Output #1. Output #2.Output #3.  

注:PHP 标记外的新行已被输出,但是 echo 命令或 print 命令中没有暗含的新行。事实上,命令提示符重新出现在 Output #2.Output #3. 所在的行中。PHP 拥有的任何其他打印函数将会像此函数一样运行正常,任何写回文件的函数也是一样的。

#!/usr/bin/php -q <?php $STDOUT = fopen("php://stdout", "w"); fwrite($STDOUT, "Output #1."); fclose($STDOUT); ?>  

以上代码将把 php://stdout 作为输出通道显式打开,并且 php://output 通常以与 php://stdout 相同的方法运行。最新版本的 PHP 可以使用 STDOUT 作为常量而不是定义上面使用的变量 $STDOUT。

STDERR:STDERR 和 php://stderr

STDERR 与 STDOUT 十分接近。用于写入此通道的所有技术将镜像 STDOUT 的那些技术,惟一的差别是您将打开 php://stderr 而不是 php://stdout 或 php://error。

STDIN:STDIN 和 php://stdin

STDIN 是从 Web 编程而来的最有趣更改,因为它向您展示了真正的用户输入而不是使用表单或其他基于浏览器的方法。尝试以下命令:

#!/usr/bin/php -q <?php $file = file_get_contents("php://stdin", "r"); echo $file; ?>  

这段代码的工作原理应当很像 cat,回转提供给它的所有输入。但是,这时它还不能接受参数。

第一个 PHP shell 脚本

很好 —— 从这里开始事情会变得非常有趣。运用到目前为止学到的简单知识,您可以创建简单而有用的 shell 脚本。在文本编辑器中键入以下代码。


清单 2. randomize-lines

#!/usr/bin/php -q <?php $lines = split("\n", file_get_contents("php://stdin", "r")); shuffle($lines); foreach ($lines as $line) { if ($line !== "") { echo "$line\n"; } } ?>  

现在,只需一些快速检查即可运行这个脚本:

确保 hashbang(第一行,以 #! 开头)被设为先前描述的 PHP 可执行文件的位置

保存文件

使用 chmod 添加可执行权限

运行程序

注:randomize-lines 将完全执行所期望的操作:它打乱键入的输入内容行并将它们以不同的顺序返回回来。这项功能可以颇具价值地填补 shell 脚本库中的空白。

作为此脚本的应用程序示例,您可以使用它为音乐或视频播放器动态生成随机播放列表。例如,要打乱 XMMS 播放列表,请尝试:

./randomize-lines < .xmms/xmms.m3u > temp mv temp .xmms/xmms.m3u  

现在,再升一级。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ba9e3f3c5c8f05e8c6043ce1b5c1537a.html