2011-08-06 81 views

回答

1

而不调用一个单独的进程中的SSH隧道,这意味着你必须创建一个新的隧道为脚本的每次调用 - 因为你不能共享的另一个实例创建的隧道不知道什么时候会终止。因此,除了连接开销外,您还需要管理本地套接字池。

简而言之,这是不可行的。

较长的答案是您可以从PHP中启动守护进程/长时间运行进程,但there are a few caveats。因此,如果您可以使用程序执行功能并使用命令行工具访问一组POSIX工具,则可以。如果你可以设置一个密钥对(带有一个加密的私钥),以避免必须解析程序的I/O以在正确的位置注入密码(或者使用类似的东西'expect'来处理它)。

2

我能够使用ssh2_tunnel,socket_create_listen()pcntl_fork的组合来做到这一点。基本上隧道就是我们想用来连接到MySQL盒子上的端口,但是因为PDO不支持通过套接字连接,所以我们必须在专用的php分支上通过socket_create_listen创建一个端口,只需将数据从unix套接字到ssh隧道。

PDO (php main proc) -> random socket port on 127.0.0.1 -> data proxy (php fork proc) -> ssh2_tunnel resource -> ssh server -> mysql process. 
+0

你能详细说明一下步骤吗? –