如何将STDIN传递给PHP生成的proc?

时间:2014-05-10 22:57:33

标签: php stdin proc

致我的PHPeoples,

这有点怪异的PHPuzzle,但我想知道它是否是可能的。

最终目标是

的等效功能
mysql mydb < file.sql

但是使用像这样的API

./restore < file.sql

其中restore是这样的PHP脚本

#!/usr/bin/env php

$cmd = "msyql mydb";
passthru($cmd, $status);

但是,我想将STDIN传递给passthru命令。

这里明显的好处是我可以将restore放在管道中的某个地方,一切都很好。这是一个例子

# would be pretty awesome!
ssh $remote "msyqldump $config mydb | gzip" | gzip -dc | ./restore

无论如何,我怀疑是否可以使用passthru,但可能会以某种方式使用proc_open


作为最后一个案例,如果一个无法解决的PHP版本,我会做这样的事情

./restore file.sql

使用这样的脚本

#!/usr/bin/env php

$cmd = sprintf("mysql mydb < %s", $argv[1]);
passthru($cmd, $status);

2 个答案:

答案 0 :(得分:1)

PHPwnd

<强> ./恢复

#!/usr/bin/env php
<?php

// set descriptors
$desc = array(
  0 => array("file", "php://stdin", "r"),
  1 => array("pipe", "w"),
  2 => array("pipe", "w")
);

// open child proc
$proc = proc_open("mysql -uUSER -pPASS mydb", $desc, $pipes);

if (is_resource($proc)) {

  // display child proc stdout
  echo stream_get_contents($pipes[1]);

  // close file streams
  array_map('fclose', $pipes);

  // get return value
  $ret = proc_close($proc);

  // display return value
  printf("command returned %s\n", $ret);
}

使用示例

cat file.sql.gz | gzip -dc | ./restore

答案 1 :(得分:1)

什么! PHProfound!

结果passthru已经这样做了! PHenomenalP!

检查出来,PHPals:

<强> gzip.php

#!/usr/bin/env php
<?php

passthru("gzip", $status);

if ($status !== 0) {
  error_log("gzip exited with status %d", $status);
}

PHProgressivist如何!

echo "hello" | php gzip.php | gzip -dc

输出

hello