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实现异步操作的研究
Feb 03 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
PHP基本语法总结
Sep 06 PHP
PHP利用MySQL保存session的实现思路及示例代码
Sep 09 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
php对接java现实加签验签的实例
Nov 25 PHP
PHP编程实现csv文件导入mysql数据库的方法
Apr 29 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
YII2.0框架行为(Behavior)深入详解
Jul 26 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
Dec 31 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
js中设置元素class的三种方法小结
2011/08/28 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
干货!教大家如何选择Vue和React
2017/03/13 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
Vue中computed及watch区别实例解析
2020/08/01 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
pygame播放音乐的方法
2015/05/19 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
python 读取二进制 显示图片案例
2020/04/24 Python
python 通过文件夹导入包的操作
2020/06/01 Python
Python错误的处理方法
2020/06/23 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
毕业生简历自我评价范文
2014/04/09 职场文书
关于感谢信的范文
2015/01/23 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js