何かに関する情報を得るために他のサーバーに接続する必要があるPHPスクリプトがあります。
私は現在ControlMaster auto
この目的のためにSSHを使用しており、うまくいきます。
しかし、問題は待ち時間が高すぎるということです。 80ミリ秒しかshell_exec
かかりませんssh example.com
。これは、サーバー間の実際のレイテンシ(イーサネットケーブルを介して接続されるため、0.2ミリ秒)よりはるかに高いです。
だから今は簡単に考えてみたいです。既存のSSH接続を介したデータ転送新しいSSH接続を既存の接続に再利用する代わりに。
しかし、どうすればいいのかわかりません。データを渡すstdin
最良の方法は何ですか?既存のSSHで接続example.com
し、stdout
結果出力を読み込みます。
(BASHソリューションはここでは大丈夫です。PHPに関連するものは必要ありません。)
ベストアンサー1
あなたがあなたControlMaster auto
の既存のTCP接続が再利用されました。しかし、TCP接続は依然として非常に迅速に確立されます。
80ミリ秒の遅延は、次の要因の組み合わせによって発生する可能性があります。
- phpは
shell_exec
新しいシェルを起動します(試してexec
みますか?) - 既存の接続を介して新しいSSHチャネルを確立する追加のオーバーヘッド
- 新しいSSHチャネルを介してリモートサーバーでコマンドを実行する
より速い応答が必要な場合は、まずそれぞれを個別に測定してから、遅い部分の遅延時間を短縮することをお勧めします。 #2が遅くなると、既存の永続SSHチャネルを介してコマンドを送信できます。名前付きパイプリモートコマンドを使用する繰り返し読みます(@symcbeanが提起した警告が適用されます)。
このような
mkfifo /tmp/f_in
mkfifo /tmp/f_out
tail -f /tmp/f_in | ssh [email protected] 'bash -c "while read name; do echo hello \$name; done"' > /tmp/f_out &
time response=$(head -n 1 /tmp/f_out & echo dwurf > /tmp/f_in); echo $response
これらのどれも、情報を照会できるWebサービスを作成するのと同じくらい高速ではありません。私もそれは非常に信頼できないだろうと予想した。