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实现将GB编码转换为UTF8
Nov 25 PHP
解决phpmyadmin中文乱码问题。。。
Jan 18 PHP
php 无极分类(递归)实现代码
Jan 05 PHP
第二章 PHP入门基础之php代码写法
Dec 30 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
php编写的简单页面跳转功能实现代码
Nov 27 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
php中yar框架实例用法讲解
Dec 27 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
python+selenium开发环境搭建图文教程
2017/08/11 Python
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
对python sklearn one-hot编码详解
2018/07/10 Python
Python docx库用法示例分析
2019/02/16 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
python生成特定分布数的实例
2019/12/05 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
《桂花雨》教学反思
2014/04/12 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
财务审计整改报告
2014/11/06 职场文书
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers