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 相关文章推荐
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
Aug 26 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
ThinkPHP之foreach标签使用概述
Jun 30 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
php编写的抽奖程序中奖概率算法
May 14 PHP
PHP中preg_match函数正则匹配的字符串长度问题
May 27 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
php之可变函数的实例详解
Sep 13 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 PHP
php post换行的方法
Feb 03 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php中session退出登陆问题
2014/02/27 PHP
php实现图片局部打马赛克的方法
2015/02/11 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
javascript 实现map集合
2015/04/03 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
详解React 元素渲染
2020/07/07 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
跟老齐学Python之用Python计算
2014/09/12 Python
跟老齐学Python之集合(set)
2014/09/24 Python
python编程实现归并排序
2017/04/14 Python
Python快速排序算法实例分析
2017/11/29 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
PyQt5组件读取参数的实例
2019/06/25 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
大二学期个人自我评价
2014/01/13 职场文书
文明家庭先进事迹材
2014/01/27 职场文书
广告创意求职信
2014/03/17 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
龙门石窟导游词
2015/02/02 职场文书
安全教育主题班会总结
2015/08/14 职场文书