有没有办法通过PHP脚本检测用户的连接。想要检测3g,WIFI,4g和Lite。我想检测用户来自哪里。我已经有了JavaScript解决方案,但出于某些原因我想在PHP中使用它。
答案 0 :(得分:18)
您有时可以分辨出WIFI和非WIFI之间的区别,有时您无法区分它们。
你永远不能用PHP来区分3G / 4G / LTE。
假设和术语
我假设智能手机通过浏览器连接到您的HTTP服务器,您的服务器使用PHP来处理请求。如果情况并非如此,请澄清您的问题。
术语:我将使用" ISP"指提供互联网服务但不是电话运营商的公司。
服务器获取了哪些信息?
当您的设备连接到PHP服务器时,它会告诉服务器一些有关自身的信息,服务器可以知道设备的IP地址,用户代理等。
问题
问题是浏览器"不关心"它是什么连接,它对浏览器发送到服务器的信息没有影响。如果浏览器在3G / 4G / LTE上,它将发送与Wifi上发送的完全相同的信息。
Semi" Proof":将数据从设备传输到HTTP服务器的HTTP协议完全不了解底层网络堆栈。
我们如何识别连接呢?
Wifi / Non-Wifi之间的唯一区别是:IP地址。
ISP拥有大量保留的IP地址。如果您可以检测到此IP地址属于特定ISP,则必须是Wifi连接。
同样,电话运营商拥有大量保留的IP地址。如果您可以检测到此IP地址属于特定的电话运营商,则必须是3G / 4G / LTE连接!
在实践中付诸实践
我们需要以某种方式将每个IP地址与ISP /运营商相关联,一种方法是拥有一个包含所有ISP /运营商的巨大数据库及其各自的保留IP。 在实践中,简单的WHOIS查找可以揭示来源。
例如,WHOIS查找随机IP: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连接。
答案 1 :(得分:0)
一种可能的解决方案是使用geoip_isp_by_name php函数获取ISP的名称,然后通过某些API或刮取检查此ISP提供的技术。
答案 2 :(得分:0)
在PHP或任何其他服务器端语言中都不可能。您必须从客户端(浏览器)获取此类信息,并且当前没有标准HTTP标头,浏览器可以使用它来传递连接类型信息(List of HTTP header fields)。
浏览器可能知道连接类型,您可以使用客户端脚本(即javascript)或插件获取该信息。