PHP 知道自己的 IP,$_SERVER["SERVER_ADDR"]
但我如何读取网络配置网络掩码、广播等的其余部分?
一种解决方案是在我的 Linux 服务器上使用 exec 获取信息,但这将是一个非常复杂的正则表达式来分割这些信息
PHP 知道自己的 IP,$_SERVER["SERVER_ADDR"]
但我如何读取网络配置网络掩码、广播等的其余部分?
一种解决方案是在我的 Linux 服务器上使用 exec 获取信息,但这将是一个非常复杂的正则表达式来分割这些信息
Ubuntu:
exec("/sbin/ifconfig", $data);
$data = implode($data, "\n");
foreach (preg_split("/\n\n/", $data) as $int) {
preg_match("/^([A-z]*\d)\s+Link\s+encap:([A-z]*)\s+HWaddr\s+([A-z0-9:]*).*" .
"inet addr:([0-9.]+).*Bcast:([0-9.]+).*Mask:([0-9.]+).*" .
"MTU:([0-9.]+).*Metric:([0-9.]+).*" .
"RX packets:([0-9.]+).*errors:([0-9.]+).*dropped:([0-9.]+).*overruns:([0-9.]+).*frame:([0-9.]+).*" .
"TX packets:([0-9.]+).*errors:([0-9.]+).*dropped:([0-9.]+).*overruns:([0-9.]+).*carrier:([0-9.]+).*" .
"RX bytes:([0-9.]+).*\((.*)\).*TX bytes:([0-9.]+).*\((.*)\)" .
"/ims", $int, $regex);
if (!empty($regex)) {
$interface = array();
$interface = array();
$interface['name'] = $regex[1];
$interface['type'] = $regex[2];
$interface['mac'] = $regex[3];
$interface['ip'] = $regex[4];
$interface['broadcast'] = $regex[5];
$interface['netmask'] = $regex[6];
$interface['mtu'] = $regex[7];
$interface['metric'] = $regex[8];
$interface['rx']['packets'] = $regex\[9];
$interface['rx']['errors'] = $regex\[10];
$interface['rx']['dropped'] = $regex\[11];
$interface['rx']['overruns'] = $regex\[12];
$interface['rx']['frame'] = $regex\[13];
$interface['rx']['bytes'] = $regex\[19];
$interface['rx']['hbytes'] = $regex\[20];
$interface['tx']['packets'] = $regex\[14];
$interface['tx']['errors'] = $regex\[15];
$interface['tx']['dropped'] = $regex\[16];
$interface['tx']['overruns'] = $regex[17];
$interface['tx']['carrier'] = $regex[18];
$interface['tx']['bytes'] = $regex[21];
$interface['tx']['hbytes'] = $regex[22];
$interfaces[] = $interface;
}
}
来源:正则表达式模式解析 ifconfig
您可以使用该exec()
功能来运行 ipconfig 或 ifconfig,具体取决于您的服务器以及您是否有权限。然后,您需要从返回的字符串数组中抓取结果。
exec('ifconfig',$output); //use ipconfig for windows
print_r($output);
如果您不想使用我们ifconfig
,您可以创建一个您仍然可以使用的自定义脚本,exec()
但它具有更清晰的输出以便于操作。