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可以测试,不知道这么测试数据库连接的方法是否具有通用性。

posted @ 2023-09-01 15:59  carol2014  阅读(47)  评论(0编辑  收藏  举报