我正在尝试编写一个简单的PHP脚本来接收来自stdin
的数据,处理它,然后将其写入stdout
。我知道PHP可能不是这类东西的最佳语言,但我需要现有的功能。
我试过
<?php
$file = file_get_contents("php://stdin", "r");
echo $file;
?>
但它不起作用。我这样调用它:echo -e "\ndata\n" | php script.php | cat
。并没有得到任何错误消息。我正在尝试构建的脚本实际上将成为更大管道的一部分。
有关为什么不起作用的任何线索?
PS:我对PHP不是很有经验。
答案 0 :(得分:6)
如果你是管道,你需要缓冲输入,而不是一次处理所有输入,只需按照* 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);
答案 1 :(得分:3)
要将php脚本放在管道中,您可以使用:
xargs -d "\n" ./mysrcipt.php --foo
对于许多行/ args,./myscript.php将被调用几次,但始终使用--foo。
e.g:
./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
将使用echo调用脚本两次到stdout / less:
0:./myscript
1:--foo
2:[file-line1]
3:[file-line2]
...
800:[file-line799]
0:./myscript
1:--foo
2:[file-line800]
...
答案 2 :(得分:0)
是的,让它运转起来。
<?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的食谱。