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 curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
Function eregi is deprecated (解决方法)
Jun 21 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
Apr 01 PHP
async和DOM Script文件加载比较
Jul 20 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
Nov 22 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
Jun 20 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
Zend Framework分页类用法详解
Mar 22 PHP
php实现的debug log日志操作类实例
Jul 12 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
PHP常见的几种攻击方式实例小结
Apr 29 PHP
PHP实现简易图形计算器
Aug 28 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
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
用PHP连接Oracle数据库
2006/10/09 PHP
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
php日历[测试通过]
2008/03/27 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
python代码如何注释
2020/06/01 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
怎样声明子类
2013/07/02 面试题
软件测试常见笔试题
2012/02/04 面试题
2014年综治宣传月活动总结
2014/04/28 职场文书
世界环境日活动总结
2015/02/11 职场文书
大学生受助感言
2015/08/01 职场文书
MySQL深分页问题解决思路
2022/12/24 MySQL