У меня есть PHP-скрипт, которому нужно связаться с другим сервером для получения информации о чем-то.
В настоящее время я использую SSH (через ControlMaster auto
) для этого, который работает правильно.
Однако проблема в том, что задержка слишком высока - просто shell_exec
'ing ssh example.com
занимает 80 миллисекунд, что намного больше, чем фактическая задержка между серверами (0.2 мс, поскольку они соединены Ethernet-кабелем).
Поэтому сейчас я думаю о том, чтобы просто передавать данные через существующее SSH-соединение, а не пытаться мультиплексировать новое SSH-соединение в существующее.
Однако я не уверен, как это сделать. Какой лучший способ передать данные в stdin
существующего SSH-соединения к example.com
и затем прочитать полученный вывод из stdout
?
.
(BASH-решение подойдет - мне не нужно ничего специфичного для PHP.)
Если вы используете ControlMaster auto
, вы уже повторно используете существующее TCP-соединение , но в любом случае TCP-соединение устанавливается очень быстро.
Задержка в 80 мс, вероятно, вызвана комбинацией:
shell_exec
запуск новой оболочки (попробуйте exec
?)Если вам нужны более быстрые ответы, сначала измерьте каждый из них по отдельности, а затем поработайте над уменьшением задержки в той части, которая медленнее. Если вы обнаружите, что #2 замедляет вас, как вы подозреваете, вы можете попробовать отправить свои команды по существующему постоянному каналу ssh, возможно, через именованный канал с вашей удаленной командой в read -while loop(будут применяться предостережения @symcbean ).
Примерно так
mkfifo /tmp/f_in
mkfifo /tmp/f_out
tail -f /tmp/f_in | ssh user@example.com '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
Ничто из этого никогда не будет таким же быстрым, как создание сетевой службы, которую вы можете запрашивать для получения информации. Я также ожидаю, что это будет довольно ненадежно.
Если бы у вас было «статическое» соединение ssh, как бы экземпляр php-скрипта привязывался к нему, чтобы использовать его?
Очень скоро мы начнем говорить о семантике блокировки (, которую сложно реализовать в php ). Тогда есть проблема масштабирования. Ваше текущее решение будет очень хорошо масштабироваться, поскольку каждое ssh-соединение является дискретным.
Пока я предполагаю, что вы управляете кодом, работающим на обоих устройствах. Если причина, по которой вы используете ssh, заключается в том, что на ssh-сервере выполняется какой-то проприетарный код, то это устраняет множество шаблонов для решения.
Если они подключены через Ethernet, следует ли считать сеть доверенной? Почему бы не использовать что-то вроде rsh?
Важно ли разделение привилегий между клиентом и сервером?
Попахивает проблемой XY.
Единственными практическими решениями здесь являются:
1 )написать сервер для работы на стороне клиента ssh, который поддерживает открытое соединение ssh и разделить его доступ к клиентам, подключающимся с локального хоста, без накладных расходов на ssh. Это не тривиально и не масштабируется.
2 )реализация клиента и сервера с использованием протокола с малой задержкой и любой связанной аутентификацией/целостностью/конфиденциальностью. Это тоже не тривиально. И вы не сказали нам, как и почему вы в настоящее время используете ssh.