本文实例讲述了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程序设计有所帮助。
这个对于 echo 2 | ./main 为什么没有输出,怎么应对这个情况
我试图通过“网络在行动”这本书来掌握网络概念。 在我看来,有几个概念解释得不太好或太模糊。因此,我想我会来这里就这些话题做一些明确的解释。 渠道管道: 所以我有一个这样的渠道管道: 对于channelInitializer,从概念上讲,我会假设该过程将按以下顺序进行:
我目前在PHP中使用proc_open()与命令行工具进行通信。它会自动为STDIN、STDOUT和STDERR创建多达3个文件描述符,因为超过3个管道会破坏Windows兼容性。它适用于Windows XP和我的Mac 10.7。 然而,我希望能够创建我自己的命名管道,以便更好地控制。如果我不能这样做,那么我必须维护进程资源及其流资源之间的引用,这使我的代码过于复杂。我不能使用文件,因为它们会填
stephen@stephens-MacBook-Pro ~ % find ./ -name 'charles*'|xargs rm -rf stephen@stephens-MacBook-Pro ~ % find ./ -name 'charles*' .//Library/Application Support/Charles/ca/charles-proxy-ssl-proxying-ce
我正在尝试使用动态ChannelHandler管道实现Netty 4. X。正如人们建议的“出于性能考虑,在运行时使用调用而不是管道修改”,我实现了一个Server、一个RouterInoundHander和一个Client来测试这个理论。但它不起作用。这是我的代码 计算机网络服务器 RouterInboundHandler 和客户 如代码所示,在Channel的连接初始化阶段创建了Channel
本文向大家介绍批处理命令教学之管道符号(|),包括了批处理命令教学之管道符号(|)的使用技巧和注意事项,需要的朋友参考一下 管道符(|)的作用是将符号前的进程输出,当做符号后进程的输入。 例如: 有两条命令,“dir /s /b /a”和“ find ".txt"”,第一条显示当前文件夹中的所有文件、文件夹,第二条是查找含有字符“.txt”的字符串。 两条命令用管道符(|)连接就可以“查找当前文件