2014-05-10 2 views
0

내 PHPe에게,STDIN을 PHP로 생성 된 proc 파일로 파이프하는 방법은 무엇입니까?

이것은 일종의 이상한 PHPuzzle이지만, 나는 그것이 PHPoss인지 궁금해.

최종 목표는

mysql mydb < file.sql 

의 동일한 기능입니다 그러나 restore

#!/usr/bin/env php 

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

같은 PHP 스크립트, 나는 그러나 인이

./restore < file.sql 

같은 API와 STDIN을 passthru 명령에 전달하려고합니다.

명확한 이점은 파이프 라인 어딘가에 restore을 넣을 수 있고 모든 것이 복숭아로 작동한다는 것입니다. 여기에 어떤 식 으로든 아마 proc_open와는 passthru를 사용 가능 의심하지 않지만, 어쨌든 예

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

입니까? 마지막 경우의 수단으로


, 해결 못하는 PHPredicament의 경우에,이

#!/usr/bin/env php 

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

답변

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 
1

PHPwnd

같은 스크립트를이

./restore file.sql 

과 같이 할 것 ./restore

#!/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 
관련 문제