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企业级应用之常见缓存技术篇
Jan 27 PHP
php 获取本地IP代码
Jun 23 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
Dec 22 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
作为程序员必知的16个最佳PHP库
Dec 09 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
详解Yii2.0 rules验证规则集合
Mar 21 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 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
虫族 ZERG 概述
2020/03/14 星际争霸
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
angular.element方法汇总
2015/01/07 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
Python爬虫爬验证码实现功能详解
2016/04/14 Python
python字典的常用操作方法小结
2016/05/16 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
详解python变量与数据类型
2020/08/25 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
医院门卫岗位职责
2013/12/30 职场文书
市场开发与营销专业求职信
2013/12/31 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
2014年师德承诺书
2014/05/23 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
英语感谢信范文
2015/01/20 职场文书
银行培训心得体会范文
2016/01/09 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python