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 实例化类的一点摘记
Mar 23 PHP
一步一步学习PHP(2)――PHP类型
Feb 15 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
Jan 23 PHP
ThinkPHP3.1新特性之内容解析输出详解
Jun 19 PHP
PHP生成条形图的方法
Dec 10 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
php实现网站留言板功能
Nov 04 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
利用php_imagick实现复古效果的方法
Oct 18 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
PHP如何使用cURL实现Get和Post请求
Jul 11 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
一段批量给页面上的控件赋值js
2010/06/19 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
python实现超市扫码仪计费
2018/05/30 Python
对python 命令的-u参数详解
2018/12/03 Python
Python3 翻转二叉树的实现
2019/09/30 Python
简单的命令查看安装的python版本号
2020/08/28 Python
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
大学生年度自我鉴定
2013/10/31 职场文书
会计专业应届生自荐信
2014/02/07 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
护理心得体会范文
2016/01/22 职场文书