php测试网络连接
偶然听到一个需求,一个web应用需要部署到不同的两个网段中,连接同一台数据库server(双网卡,可以同时连接不同的两个网段),如何实现部署到不同网段中不用修改数据库连接?假设连个网段的web server同时包含linux和windows系统
简单的想法:测试网络连接,如果连不上一个ip就去连接另一个ip
<?php $ip = ''; $port = 3306; var_dump(PHP_OS); $t = time(); echo '<pre>'; var_dump('------ping-------------'); $info = null; $status = null; exec('ping ' . $ip, $info, $status); var_dump($info, 'status:' . $status, '连接时间:' . (time() - $t)); $t = time(); var_dump('------linux-traceroute windows-ping -------------'); if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $exec_string = 'ping ' . $ip; } else { $exec_string = 'traceroute ' . $ip; } exec($exec_string, $info, $status); var_dump($info, 'status:' . $status, '连接时间:' . (time() - $t)); $t = time(); var_dump('------telnet-------------'); exec('telnet ' . $ip . ' ' . $port, $info, $status); var_dump($info, 'status:' . $status, '连接时间:' . (time() - $t)); $t = time(); var_dump('--------fsockopen-----------'); $timeout = 5; $fsock = fsockopen($ip, $port, $errno, $errstr, $timeout); var_dump(is_resource($fsock) ? '可以连接' : '无法连接', $errno, $errstr, '连接时间:' . (time() - $t));
可连接IP在windows server下结果如下:
string(5) "WINNT" string(23) "------ping-------------" //ping array(11){......} string(8) "status:0" string(16) "连接时间:4" string(50) "------linux-traceroute windows-ping -------------" //ping array(22) {......} string(8) "status:0" string(16) "连接时间:3" string(25) "------telnet-------------" //ping array(22) {.....} string(8) "status:1" string(16) "连接时间:0" string(28) "--------fsockopen-----------" string(12) "可以连接" int(0) string(0) "" string(16) "连接时间:0"
可连接IP在linux server下结果如下:
string(5) "Linux" string(23) "------ping-------------" //ping array(0) { } string(8) "status:2" string(16) "连接时间:0" string(50) "------linux-traceroute windows-ping -------------" //traceroute array(31) {......} string(8) "status:0" string(17) "连接时间:26" string(25) "------telnet-------------" //traceroute array(34) {.....} string(8) "status:1" string(16) "连接时间:0" string(28) "--------fsockopen-----------" string(12) "可以连接" int(0) string(0) "" string(16) "连接时间:0"
不可连接IP在windows server下结果如下:
string(5) "WINNT" string(23) "------ping-------------" array(9) {.....} string(8) "status:1" string(17) "连接时间:19" string(50) "------linux-traceroute windows-ping -------------" array(18) {....} string(8) "status:1" string(17) "连接时间:19" string(25) "------telnet-------------" array(18) {....} string(8) "status:1" string(16) "连接时间:0" string(28) "--------fsockopen-----------" string(12) "无法连接" int(10060) string(140) "連線嘗試失敗,因為連線對象有一段時間並未正確回應,或是連線建立失敗,因為連線的主機無法回應。" string(16) "连接时间:5"
不可连接IP在linux server下结果如下:
string(5) "Linux" string(23) "------ping-------------" array(0) { } string(8) "status:2" string(16) "连接时间:0" string(50) "------linux-traceroute windows-ping -------------" array(2) {.....} string(8) "status:0" string(16) "连接时间:3" string(25) "------telnet-------------" array(3) {.....} string(8) "status:1" string(16) "连接时间:3" string(28) "--------fsockopen-----------" string(12) "无法连接" int(113) string(16) "No route to host" string(16) "连接时间:3"
由以上结果可以看出
1 ping
linux环境下 使用php exec执行ping命令,无论ip地址是否可以连接,均返回空数组,返回码均为2
windows环境下 ip可以连接返回码为0,ip不能连接返回码为1,返回数组长度不同
2 linux-traceroute windows-ping
windows环境下 ip可以连接返回码为0,ip不能连接返回码为1,返回数组长度不同
linux环境下,无论ip地址是否可以连接,返回码均为0,返回数组长度不同,建立连接时间稍长
3 telnet
windows环境下 无论ip地址是否可以连接,返回码均为1,返回数组长度不同
linux环境下 无论ip地址是否可以连接,返回码均为1,返回数组长度不同
4 fsockopen函数
windows和linux环境下 ip可以连接返回连接-资源类型,ip不能连接返回false
可以根据结果判断网段,然而没有大量的server可以测试,不知道这么测试数据库连接的方法是否具有通用性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix