这里有新鲜出炉的 PHP 面向对象编程,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
这篇文章主要介绍了 Linux 平台 php 命令行程序处理管道数据的方法, 结合实例形式分析了 Linux 平台管道提示符的功能及 php 使用命令行处理管道数据的相关实现技巧, 需要的朋友可以参考下
本文实例讲述了 Linux 平台 php 命令行程序处理管道数据的方法。分享给大家供大家参考,具体如下:
linux 下有一个强大的命令 |(管道提示符). 它的作用是将前一个命令的结果交给后一条命令并作为后一条命令的输入. 而 linux 下的大多数命令 也都支持这种方式. 可是当笔者写完一个 php 的命令行小程序以后, 对于怎样获得前一个命令的结果却陷入了僵局. 难道 php 不支持这样的操作
于是又开始问 google 大叔. 找来找去, 都是说 php 的命令行模式是怎么回事儿, 也没有和我想知道的问题相关的资料. 难道是俺的关键字用的不对? 或者是 传说的 RP 问题? google 无果以后, 开始想找人求助. 我认识的做 php 的朋友中, 谁可能会做过命令的程序呢, 然后问. 问来问去都说没玩过或者不熟悉. 又是无果, 哎, 真急死人. 看来只能靠自己了, 于是开始自救. 于是开始研究 php 的 argc 和 argv, 试来试去都不行. 开始静下心来细细思考怎么回事儿. 隐约记得以前玩 perl 的时候, 想获得输入用的是一个'<>'来完成的. 而'<>'代表从标准输入读东西的意思. 再想想管道符的 作用不就是代替人输入东西嘛. 思路打开了, 于是有了下面这段小程序:
- [rainbird@rainbird-desktop ~]$cat a.php
- #!/usr/bin/php -q
- <?php
- $fh = fopen('php://stdin','r');
- echo fgets($fh);
- fclose($fh);
- ?>
- [rainbird@rainbird-desktop ~]$echo "aaaaa"|./a.php
- aaaaa
呵呵, 成功搞定! 但是这样的话, 有一个小问题:
- [rainbird@rainbird-desktop ~]$tail /etc/passwd|./a.php
- couchdb:x:106:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash
一次只能读入一行! 看来是 fgets 的问题了. 怎么样才可以一下子把所有的内容读过来呢? 在使用 php 的过程中, 我知道, 如果想一下子把一个文件的内容放 在一个变量而不是数组的话用: file_get_contents. 但是它是对文件操作的, 不知道是不是适合标准输入. 不知道可以试一下嘛. 看结果:
- [rainbird@rainbird-desktop ~]$cat a.php
- #!/usr/bin/php -q
- <?php
- echo file_get_contents('php://stdin');
- ?>
- [rainbird@rainbird-desktop ~]$tail /etc/passwd|./a.php
- couchdb:x:106:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash
- haldaemon:x:107:114:Hardware abstraction layer,,,:/var/run/hald:/bin/false
- speech-dispatcher:x:108:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh
- kernoops:x:109:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
- saned:x:110:116::/home/saned:/bin/false
- pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false
- gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false
- rainbird:x:1000:1000:rainbird,,,:/home/rainbird:/bin/bash
- sshd:x:113:65534::/var/run/sshd:/usr/sbin/nologin
- postfix:x:114:122::/var/spool/postfix:/bin/false
真帅! 搞定. 就这么简单的几行, php 就简单实现了 cat 的功能:
- [rainbird@rainbird-desktop ~]$./a.php </etc/passwd
- root:x:0:0:root:/root:/bin/bash
- daemon:x:1:1:daemon:/usr/sbin:/bin/sh
- bin:x:2:2:bin:/bin:/bin/sh
- sys:x:3:3:sys:/dev:/bin/sh
- sync:x:4:65534:sync:/bin:/bin/sync
- ......
对 php 开始由衷的折服. php 也开始融入了 linux 一切皆文件的思想, 竟可以把标准输入作为一个文件来处理. 细细想来: 其实这是一个简单的小问题, 只 是因为没有做过这样一个事情, 思维受到了限制, 当接触这样一个需求的时候一下子不知道应该怎么思考. 用 perl,python,ruby 做程序的同学们再 遇到这样的需求知道怎么处理了吧:) 这个小经历再次印证: 程序是算法的表达方式, 算法是灵魂, 有思路才有出路.
希望本文所述对大家 PHP 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0804/341343.html