뭔가에 대한 정보를 얻기 위해 다른 서버에 접속해야 하는 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
이 중 어느 것도 정보를 쿼리할 수 있는 웹 서비스를 만드는 것만큼 빠르지는 않습니다. 나는 또한 그것이 매우 신뢰할 수 없을 것이라고 예상했습니다.
답변2
"정적" SSH 연결이 있는 경우 이를 사용하기 위해 PHP 스크립트 인스턴스를 어떻게 연결합니까?
곧 우리는 잠금 의미론(PHP에서 구현하기 어려움)에 대해 논의하기 시작했습니다. 그런 다음 스케일링 문제가 있습니다. 각 SSH 연결이 개별적이기 때문에 현재 솔루션의 확장성이 좋습니다.
이제 두 상자 모두에서 실행되는 코드를 제어한다고 가정합니다. ssh를 사용하는 이유가 ssh 서버가 일부 독점 코드를 실행하고 있기 때문이라면 솔루션에서 많은 패턴이 제거됩니다.
이더넷을 통해 연결되어 있다면 네트워크가 신뢰할 수 있다고 가정해야 합니까? rsh와 같은 것을 사용하면 어떨까요?
클라이언트와 서버 간의 권한 분리가 중요합니까?
이것은 XY 문제처럼 들립니다.
여기서 유일한 실용적인 해결책은 다음과 같습니다.
1) 개방형 SSH 연결을 유지하고 SSH 오버헤드 없이 localhost에서 연결하는 클라이언트에 대한 시간 공유 액세스를 제공하는 SSH 클라이언트에서 실행되는 서버를 작성합니다. 이는 사소한 일도 아니고 확장 가능한 일도 아닙니다.
2) 대기 시간이 짧은 프로토콜과 관련 인증/무결성/기밀성을 사용하여 클라이언트와 서버를 구현합니다. 이것도 작은 문제가 아닙니다. 그리고 현재 SSH를 사용하는 방법과 이유를 알려주지 않았습니다.