PHP スクリプトを外部エディタにエスケープし、その後に戻るにはどうすればよいですか?
-
02-07-2019 - |
質問
具体的には、ある時点でユーザーからの入力を必要とする PHP コマンドライン スクリプトがあります。外部エディター (vi など) を実行できるようにしたいのですが、エディターの実行が完了するまで待ってからスクリプトを再開したいと考えています。
私の基本的なアイデアは、一時ファイルを使用して編集を行い、後でファイルの内容を取得するというものでした。次のようなもの:
$filename = '/tmp/script_' . time() . '.tmp';
get_user_input ($filename);
$input = file_get_contents ($filename);
unlink ($filename);
これは PHP コマンドライン スクリプトからは不可能だと思いますが、同じ効果を達成するために使用できる何らかのシェル スクリプトのトリックがあることを期待しています。
他のスクリプト言語でこれを実現する方法についての提案も大歓迎です。
解決
エディターの出力をターミナルにリダイレクトできます。
system("vim > `tty`");
他のヒント
これを試してみたところ、Windows では正常に動作したので、おそらく vi または Linux 上で必要なアプリを使用して複製できるでしょう。
鍵となるのは、 exec()
メモ帳 (この場合) の実行中に php プロセスがハングします。
<?php
exec('notepad c:\test');
echo file_get_contents('c:\test');
?>
$ php -r test.php
編集:あなたの試みが示し、bstarkが指摘したように、私のメモ帳テストは新しいウィンドウを起動するのですべて問題ありませんが、接続する端末がないため、コンソールモードで実行されるエディタは失敗します。
そうは言っても、私はLinuxボックスを試してみました exec('nano test'); echo file_get_contents('test');
また、vi ほどひどく失敗することはなく、何も表示されずに実行されるだけです。何か入力し、「ctrl-X、y」を押してファイルを閉じて保存すると、PHP スクリプトが続行して、私が書いた内容が表示されます。ともかく..適切な解決策を見つけたので、新しい答えが来ました。
PHP が実行されている端末に vi を接続できるかどうかはわかりませんが、手っ取り早く簡単な解決策は、同じ端末でスクリーン エディタを使用しないことです。
ed などの行エディターを使用するか (おそらくそれは望ましくないでしょう)、system("xterm -e vi") のような新しいウィンドウを開くことができます (xterm をターミナル アプリの名前に置き換えます)。
編集して以下を追加しました:Perl では、system("vi") は単に機能します。Perl は、php が行うような手の込んだパイプライン処理やバッファリングを行わないからです。
つまり、ファイルを書くというあなたのアイデアは、簡単な解決策があるにもかかわらず、私たちがクレイジーなことを試みるように導いているようです:)
<?php
$out = fopen('php://stdout', 'w+');
$in = fopen('php://stdin', 'r+');
fwrite($out, "foo?\n");
$var = fread($in, 1024);
echo strtoupper($var);
fread() 呼び出しは、何か (1024 バイトか行末だと思います) を受信するまで php プロセスをハングさせ、次の結果を生成します。
$ php test.php
foo?
bar <= my input
BAR
system('vi');