Linux平台php命令行程序处理管道数据的方法

yipeiwu_com6年前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相关内容感兴趣的读者可查看本站专题:《php+mysql数据库操作入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

微信公众号开发之微信公共平台消息回复类实例

本文实例讲述了微信公众号开发之微信公共平台消息回复类。分享给大家供大家参考。具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的...

PHP中生成UUID自定义函数分享

UUID 全称是 Universally unique identifier,它是一种识别符,使用任意的计算机都可以生成,不需要一个中央数据库进行管理,即可以保证几乎没有重复的几率。而...

PHP array操作10个小技巧分享

1、向array中添加元素 php是一个弱类型语言。因此不必象c语言那样为php array声明长度。向其中添加元素的过程也是声明和初始化的过程。 复制代码 代码如下: $capital...

PHP图片处理类 phpThumb参数用法介绍

phpThumb几个基本参数 一些有用的参数列一下: src:目标图片的地址 w:输出图片的宽度 h:输出图片的高度(如果不指定他将按w参数等比缩放) q:输出如果是JPG格式的,可以规...

php基于curl实现随机ip地址抓取内容的方法

本文实例讲述了php基于curl实现随机ip地址抓取内容的方法。分享给大家供大家参考,具体如下: 使用php curl 我们可以模仿用户行为,既可以设置我们访问的ip及浏览器信息还可以设...