如何处理标准输入到标准输出在PHP?
我想写一个简单的PHP脚本,从stdin
中获取数据,处理它,然后将其写入stdout
。我知道PHP可能不是这种类型的最佳语言,但是我需要现有的功能。如何处理标准输入到标准输出在PHP?
我已经试过
<?php
$file = file_get_contents("php://stdin", "r");
echo $file;
?>
,但它不工作。我像这样调用它:echo -e "\ndata\n" | php script.php | cat
。并且不会收到错误消息。我正在尝试构建的脚本实际上将成为更大管道的一部分。
任何线索为什么这不起作用? PS:我对PHP不太了解。
如果您是管道系统,您将需要缓冲输入,而不是一次处理所有输入,只需按照* nix工具的标准一次进行一次。
该文件顶部的SheBang允许您直接执行该文件,而不必在命令行中调用php。
保存以下,以test.php的和运行
cat test.php | ./test.php
看到的结果。
#!php
<?php
$handle = fopen('php://stdin', 'r');
$count = 0;
while(!feof($handle)) {
$buffer = fgets($handle);
echo $count++, ": ", $buffer;
}
fclose($handle);
要放置一个PHP脚本中的管道,你可以使用:
xargs -d "\n" ./mysrcipt.php --foo
由于许多线/ ARG游戏的./myscript.php将被调用几次,但总是与--foo。
例如为:
./myscript.php:
#!/bin/php
<?php
foreach($args as $key => $value){
echo "\n".$key.":".$value;
}
?>
cat -n1000 /path/file | xargs -d "\n" ./myscript.php --foo | less
将调用脚本两次回声到stdout /更少:
0:./myscript
1:--foo
2:[file-line1]
3:[file-line2]
...
800:[file-line799]
0:./myscript
1:--foo
2:[file-line800]
...
谢谢compie。我不能将xargs的初始流分成两半。 PHP脚本必须具有整个事情。没有诉诸这样的东西,真的没有办法在管道中使用PHP? – brice 2010-07-14 19:11:16
权,得到它的工作。
<?php
$input_stream = fopen("php://stdin","r");
$text="";
while($line = fgets($input_stream,4096)){ // Note 4k lines, should be ok for most purposes
$text .= $line;
}
fclose($input_stream);
print($text);
?>
从食谱PHPBuilder。
如果在执行时没有可用的STDIN会怎么样?这不会使脚本挂起吗? – CMCDragonkai 2013-11-15 01:49:41