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 相关文章推荐
使用sockets:从新闻组中获取文章(三)
Oct 09 PHP
PHP实现手机归属地查询API接口实现代码
Aug 27 PHP
php简单浏览目录内容的实现代码
Jun 07 PHP
Memcached常用命令以及使用说明详解
Jun 27 PHP
Thinkphp中的volist标签用法简介
Jun 18 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
CI框架常用方法小结
May 17 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
THINKPHP截取中文字符串函数实例代码
Mar 20 PHP
PHP实现的多维数组去重操作示例
Jul 21 PHP
关于laravel模板中生成URL的几种模式总结
Oct 18 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 文章中的远程图片采集到本地的代码
2009/07/30 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
python音频处理用到的操作的示例代码
2017/10/27 Python
10个Python小技巧你值得拥有
2018/09/29 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
输入N,打印N*N矩阵
2012/02/20 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
会议开场欢迎词
2014/01/15 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
小学生美德少年事迹
2014/02/02 职场文书
校园安全教育广播稿
2014/02/17 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
先进个人自荐书
2015/03/06 职场文书
单位收入证明范本
2015/06/18 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
Python一行代码实现自动发邮件功能
2021/05/30 Python