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 相关文章推荐
PHP4实际应用经验篇(5)
Oct 09 PHP
php 中英文语言转换类代码
Aug 11 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
PHP+javascript制作带提示的验证码源码分享
May 28 PHP
解决CodeIgniter伪静态失效
Jun 09 PHP
PHP使用token防止表单重复提交的方法
Apr 07 PHP
PHP中子类重载父类的方法【parent::方法名】
May 06 PHP
PHP匿名函数(闭包函数)详解
Mar 22 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 PHP
swoole锁的机制代码实例讲解
Mar 04 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程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
python 重命名轴索引的方法
2018/11/10 Python
基于python实现查询ip地址来源
2020/06/02 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
应用电子专业学生的自我评价
2013/10/16 职场文书
办公室内勤工作职责
2013/12/11 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
微信早安问候语
2015/11/10 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL