Linux平台php命令行程序处理管道数据的方法

 更新时间:2016年11月10日 11:57:15   作者:flandycheng  
这篇文章主要介绍了Linux平台php命令行程序处理管道数据的方法,结合实例形式分析了Linux平台管道提示符的功能及php使用命令行处理管道数据的相关实现技巧,需要的朋友可以参考下

本文实例讲述了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+mysql数据库操作入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • 使用WAMP搭建PHP本地开发环境

    使用WAMP搭建PHP本地开发环境

    这篇文章主要为大家详细介绍了使用WAMP搭建PHP本地开发环境的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • PHP中将字符串转化为整数(int) intval() printf() 性能测试

    PHP中将字符串转化为整数(int) intval() printf() 性能测试

    早在Sql注入横行的前几年,字符串转化为整数就已经被列为每个web程序必备的操作了。web程序将get或post来的id、整数等值强制经过转化函数转化为整数,过滤掉危险字符,尽可能降低系统本身被Sql注入的可能性
    2012-03-03
  • PHP实现的增强性mhash函数

    PHP实现的增强性mhash函数

    这篇文章主要介绍了PHP实现的增强性mhash函数,使用默认mhash函数时报错,找到了两个解决方法,需要的朋友可以参考下
    2015-05-05
  • PHP实现删除字符串中任何字符的函数

    PHP实现删除字符串中任何字符的函数

    这篇文章主要介绍了PHP实现删除字符串中任何字符的函数,涉及php针对字符串的遍历与截取操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • php 无法加载mysql的module的时候的配置的解决方案引发的思考

    php 无法加载mysql的module的时候的配置的解决方案引发的思考

    今天配置php 的时候,发现没配起mysql ,wordpress提示我需要 mysql 的module之后上google搜索,大多数都是说php.ini 没加载起
    2012-01-01
  • PHP异步调用socket实现代码

    PHP异步调用socket实现代码

    浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久连接
    2012-01-01
  • php+ajax实现图片文件上传功能实例

    php+ajax实现图片文件上传功能实例

    目前常用的异步文件上传功能有几种,比较多见的如使用iframe框架形式,ajax功能效果,以及flash+php功能,需要的朋友可以参考下
    2014-06-06
  • php 友好URL的实现(吐血推荐)

    php 友好URL的实现(吐血推荐)

    下面的代码主要是伪静态的实现,搜索引擎喜欢
    2008-10-10
  • 浅析PHP开发规范

    浅析PHP开发规范

    本篇文章是小编为大家整理的关于PHP开发规范的相关内容,适合PHP初学者,一起参考下吧。
    2018-02-02
  • php HandlerSocket的使用

    php HandlerSocket的使用

    目前使用MySQL的网站,多半同时使用Memcache作为键值缓存。虽然这样的架构极其流行,有众多成功的案例,但过于依赖Memcache,无形中让Memcache成为故障的根源
    2011-05-05

最新评论