PHP获取IP地址详情在VPS主机不显示的问题如何排查
排查步骤
- 第一步:确认基础变量正常获取
先在代码开头添加打印逻辑,验证传入的域名和解析后的IP是否正确:
若IP解析失败,检查VPS的DNS配置是否正常,可在VPS命令行执行var_dump($_POST['web'], $ip_address);nslookup 测试域名验证解析能力。 - 第二步:检查allow_url_fopen配置是否开启
代码用file_get_contents发起远程HTTP请求,依赖PHP配置项allow_url_fopen = On。很多VPS默认关闭该配置,可通过phpinfo()查看当前配置值,若为Off需修改php.ini配置后重启PHP服务。 - 第三步:关闭错误抑制、开启报错查看具体问题
你代码中第一个接口调用前加了@错误抑制符,会屏蔽所有请求错误。先删除@,并在代码顶部添加报错配置:
重新访问页面即可看到具体报错信息,是请求失败、JSON解析失败还是返回结构异常。ini_set('display_errors', 1); error_reporting(E_ALL); - 第四步:验证VPS出站网络是否能访问第三方接口
在VPS命令行执行以下命令,测试是否能正常请求两个IP查询接口:
若请求超时或返回错误,检查VPS防火墙是否限制了80/443端口出站访问,或VPS出口IP是否被第三方接口封禁。如果VPS默认优先使用IPv6访问,而接口不支持IPv6,可配置请求强制走IPv4。# 测试geoplugin接口 curl "http://www.geoplugin.net/json.gp?ip=8.8.8.8" # 测试iplocate接口 curl "https://www.iplocate.io/api/lookup/8.8.8.8" - 第五步:排查HTTPS请求证书问题
第二个接口为HTTPS协议,若请求失败大概率是PHP没有配置可信CA证书导致证书校验失败。排查时可临时添加stream context忽略证书校验验证问题:
验证可行后建议正式环境配置正确的CA证书路径到php.ini的$context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ] ]); $res = file_get_contents('https://www.iplocate.io/api/lookup/'.$ip, false, $context);openssl.cafile配置项,不要长期关闭证书校验。 - 第六步:验证接口返回内容是否正常
打印两个接口的原始返回内容,确认是否返回了合法的JSON结构:
若返回非JSON内容(如拦截页面、限流提示),根据返回内容调整请求逻辑即可。var_dump(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip)); var_dump(file_get_contents('https://www.iplocate.io/api/lookup/'.$ip));
优化建议
- 推荐使用cURL扩展代替
file_get_contents发起远程请求,cURL支持超时设置、自定义请求头、错误信息获取等能力,容错性和可控性更高。 - 增加接口请求失败的降级处理,避免单个接口故障导致整个页面报错无输出。
内容的提问来源于stack exchange,提问作者iVA Enterprises
相关产品推荐
相关产品推荐

