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生成静态页面详解
Nov 19 PHP
浅析Mysql 数据回滚错误的解决方法
Aug 05 PHP
php导入大量数据到mysql性能优化技巧
Dec 29 PHP
PHP递归创建多级目录
Nov 05 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 PHP
laravel 中某一字段自增、自减的例子
Oct 11 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
php 中的信号处理操作实例详解
Mar 04 PHP
PHPExcel实现的读取多工作表操作示例
Apr 14 PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 20 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
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
对于Python中线程问题的简单讲解
2015/04/03 Python
自己使用总结Python程序代码片段
2015/06/02 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
Python 数据结构之队列的实现
2017/01/22 Python
python+django加载静态网页模板解析
2017/12/12 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
Python 转换文本编码实现解析
2019/08/27 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
大学生创业计划书的范文
2014/01/07 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
解除租赁合同协议书
2016/03/21 职场文书
防止web项目中的SQL注入
2021/12/06 MySQL
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS