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安全编程之加密功能
Oct 09 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
Yii2实现同时搜索多个字段的方法
Aug 10 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
php微信开发之图片回复功能
Jun 14 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
Jun 13 PHP
laravel 框架实现无限级分类的方法示例
Oct 31 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 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 变量的定义方法
2010/01/26 PHP
浅析PHP Socket技术
2013/08/02 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
php技巧小结【推荐】
2017/01/19 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
JS数组的高级使用方法示例小结
2020/03/14 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
HR喜欢的自荐信格式
2013/10/08 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
MySQL触发器的使用
2021/05/24 MySQL
python 经纬度求两点距离、三点面积操作
2021/06/03 Python