有没有办法使用PHP脚本检测用户的连接。想要检测3g,WIFI,4g和Lite。我想检测用户来自哪里。我已经有JavaScript的解决方案,但因为某些原因我希望用PHP实现。
有没有办法使用PHP脚本检测用户的连接。想要检测3g,WIFI,4g和Lite。我想检测用户来自哪里。我已经有JavaScript的解决方案,但因为某些原因我希望用PHP实现。
有时你可以区分WiFi和非WiFi连接,但有时你无法区分它们。
使用PHP你永远无法区分3G / 4G / LTE连接。
假设和术语
我假设智能手机通过浏览器连接到您的HTTP服务器,而您的服务器使用PHP处理请求。如果不是这种情况,请澄清您的问题。
术语:我将使用“ISP”一词来指代提供互联网服务但不是电话运营商的公司。
服务器收到哪些信息?
当您的设备连接到PHP服务器时,它会向服务器提供一些关于自身的信息,例如设备的IP地址,用户代理等。
问题
问题在于浏览器“不关心”它连接到了什么网络,也不会影响浏览器发送给服务器的信息。如果浏览器连接到了3G / 4G / LTE网络,那么它发送的信息将与连接到WiFi网络时发送的完全相同。
半证明:传输数据从设备到HTTP服务器的HTTP协议完全忽略底层网络堆栈。
那么我们如何识别连接呢?
唯一区分WiFi / 非WiFi的方法是:IP地址。
ISP有一个保留IP地址的大列表。如果您可以检测到此IP地址属于特定的ISP,则必须是WiFi连接。
同样,电话运营商也有一个保留IP地址的大列表。如果您可以检测到此IP地址属于特定的电话运营商,则必须是3G / 4G / LTE连接!
实践中如何实现
我们需要将每个IP地址与ISP /运营商相关联,一种方法是拥有所有ISP /运营商及其各自保留IP的巨大数据库。 实际上,简单的WHOIS查找可以显示来源。
例如,针对随机IP的WHOIS查找: 109.168.97.31显示了:
descr:013 Netvision
Netvision是以色列的互联网服务提供商。因此,如果这是电话连接(您可以通过用户代理进行检查),则必须是WiFi连接!
在PHP中实现
我对PHP有一点了解,也许更熟悉的人会更好地编辑这一部分。代码可能是这样的:
$company_name = geoip_isp_by_name($_SERVER['REMOTE_ADDR']);
$this_is_a_wifi_connection = is_this_wifi($company_name);
函数 is_this_wifi
应该在数据库中查找公司名称并决定这是一个手机运营商还是一个ISP公司。
问题
你仍然需要有一个ISP / 运营商列表,以便将你的WHOIS查询与它们进行比较。
有些人使用VPN / 匿名网络,IP地址可能会虚假。
有些公司既是ISP又是运营商,在这种情况下,你永远不会知道这是否是Wifi连接。
在PHP或任何其他服务器端语言中都不可能实现。您必须从客户端(浏览器)获取此类信息,目前没有标准的HTTP头可以让浏览器使用它来传递连接类型信息(HTTP头字段列表)。
浏览器可能知道连接类型,您可以使用客户端脚本(即JavaScript)或插件获取该信息。