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 相关文章推荐
PHP 超链接 抓取实现代码
Jun 29 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
PHP目录函数实现创建、读取目录教程实例
Jan 13 PHP
PHP操作mysql函数详解,mysql和php交互函数
May 19 PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
Jun 21 PHP
PHP动态输出JavaScript代码实例
Feb 12 PHP
支持中文、字母、数字的PHP验证码
May 04 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
深入理解PHP之源码目录结构与功能说明
Jun 01 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
Apr 06 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
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
2015/11/03 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
2020/04/27 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
Python sys模块常用方法解析
2020/02/20 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
初中生自我鉴定
2014/02/04 职场文书
法人委托书的范本格式
2014/09/11 职场文书
扬州个园导游词
2015/02/06 职场文书
小学生手册家长意见
2015/06/03 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
Java 在生活中的 10 大应用
2021/11/02 Java/Android
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript
vue特效之翻牌动画
2022/04/20 Vue.js