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


Posted in PHP onNovember 10, 2016

本文实例讲述了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 相关文章推荐
用ADODB来让PHP操作ACCESS数据库的方法
Dec 31 PHP
PHP 多维数组排序实现代码
Aug 05 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
Linux下PHP安装mcrypt扩展模块笔记
Sep 10 PHP
DOM基础及php读取xml内容操作的方法
Jan 23 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
Jan 17 PHP
使用PHPMailer发送邮件实例
Feb 15 PHP
删除PHP数组中的重复元素的实现代码
Apr 10 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP实现打包下载文件的方法示例
Oct 07 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 #PHP
php事件驱动化设计详解
Nov 10 #PHP
PHP的消息通信机制测试实例
Nov 10 #PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 #PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
Nov 10 #PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 #PHP
PHP yii实现model添加默认值的方法(两种方法)
Nov 10 #PHP
You might like
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
php中使用GD库做验证码
2016/03/31 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
bootstrap中添加额外的图标实例代码
2017/02/15 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
Vue 列表上下过渡效果的实例代码
2019/06/25 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
python读取excel表格生成erlang数据
2017/08/26 Python
Python中类的初始化特殊方法
2017/12/01 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
详解Python打包分发工具setuptools
2019/08/05 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
创业计划书中要认真思考的问题
2013/12/28 职场文书
大学生创业计划书的范文
2014/01/07 职场文书
探亲假请假条
2014/04/11 职场文书
班级旅游计划书
2014/05/03 职场文书
调研汇报材料范文
2014/08/17 职场文书
期中考试后的感想
2015/08/07 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python