何かに関する情報を得るために他のサーバーに接続する必要がある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サービスを作成するのと同じくらい高速ではありません。私もそれは非常に信頼できないだろうと予想した。
答え2
「静的」SSH接続がある場合、それを使用するためにPHPスクリプトインスタンスをどのように接続しますか?
まもなく私たちはロックセマンティクス(PHPで実装するのが難しい)について議論し始めました。その後、スケーリングの問題があります。各SSH接続は個別であるため、現在のソリューションのスケーラビリティが優れています。
今、両方のボックスで実行されるコードを制御すると仮定します。 sshを使用する理由がsshサーバーがいくつかの独自のコードを実行しているためである場合、ソリューションから多くのパターンが削除されます。
イーサネット経由で接続している場合は、ネットワークが信頼できると仮定する必要がありますか? rshのようなものを使用するとどうなりますか?
クライアントとサーバー間の権限の分離は重要ですか?
これはXYの問題のように聞こえます。
ここで唯一の実用的な解決策は次のとおりです。
1) オープン SSH 接続を維持し、SSH オーバーヘッドなしで localhost から接続するクライアントへの時間共有アクセスを提供する SSH クライアントで実行されるサーバーを作成します。これは些細なことでも拡張可能なものでもありません。
2)待ち時間の短いプロトコルと関連する認証/整合性/機密性を使用してクライアントとサーバーを実装します。これも小さな問題ではありません。そして、現在SSHの使用方法と理由を教えていません。