PHP でシェルスクリプトを作成し、制御をシェルに戻したい場合

proc_open() で、 PHP が作る子プロセスの stdin/stdout/stderr と、 PHP プロセス自体のそれらを繋ぐ。

具体例

大量にある MySQL サーバに簡単にログインできるようにするためのスクリプトを書きたい。

実装例

mysql_connect.php (実行権限つき)

#!/usr/bin/php -f
<?php
// usage: mysql_connect.php database_name

$dbname = $argv[1];

// get_connection_info() は適当に自作する。
list($host, $user, $password) = get_connection_info($dbname);

$proc = proc_open(
    "mysql -h $host -u $user --password=$password -A --prompt=\"\u:\d>\_\" \"$dbname\"",
    array(
        0 => STDIN,
        1 => STDOUT,
        2 => STDERR,
    ),
    $pipes
);

if (!$proc) {
    fwrite(STDERR, "Failed to connect $dbname ($user@$host)");
    exit(1);
}

foreach ($pipes as $fp) {
    fclose($fp);
}

proc_close($proc);