file_get_contents触发警告:PHP短信发送接口调用异常求助
我用以下PHP代码调用http://www.smszone.in的短信发送接口时,file_get_contents触发了警告,请求帮忙排查问题。代码如下:
$url="http://www.smszone.in/sendsms.asp?page=".$page."&username=".$usrnm."&password=".$passw."&number=".$mobile."&message="."Hi ".$admi.' '.implode($msg)." Is issued ..."."\n"."Regards"; $homepage = file_get_contents($url); if($homepage) { echo "Message Send Compleated..."; }else{ echo "Something Went Wrong..."; }触发警告:
Warning: file_get_contents( http://www.smszone.in/sendsms.asp?page=SendSmsBulk&username= *******&password=****&number=**********&message=Hi Izza AMGR-8A:...
咱们一步步来排查这个问题,先看几个最可能的原因和对应的解决办法:
1. URL参数未编码导致格式错误
你直接把变量拼接进URL,尤其是message参数里包含空格、换行符(\n)这类特殊字符,服务器根本没法正确解析这些内容,这是最常见的问题。
解决办法是用http_build_query()来自动处理所有参数的URL编码,比手动拼接靠谱多了:
// 先把所有参数整理成数组 $params = [ 'page' => $page, 'username' => $usrnm, 'password' => $passw, 'number' => $mobile, 'message' => "Hi {$admi} " . implode($msg) . " Is issued ...\nRegards" ]; // 自动生成编码后的URL查询字符串 $url = "http://www.smszone.in/sendsms.asp?" . http_build_query($params); $homepage = file_get_contents($url);
这样不管参数里有什么特殊字符,都会被转换成服务器能识别的格式。
2. PHP环境禁用了远程URL访问
很多PHP主机默认会关闭allow_url_fopen配置,这会直接导致file_get_contents没法访问远程接口。
你可以先创建一个phpinfo.php文件,内容是<?php phpinfo(); ?>,访问后搜索allow_url_fopen,如果显示Off,就需要修改php.ini:
allow_url_fopen = On
修改后记得重启Web服务器(比如Apache或者Nginx)。要是没权限改配置,那就换用cURL来发起请求,兼容性更好:
$params = [ 'page' => $page, 'username' => $usrnm, 'password' => $passw, 'number' => $mobile, 'message' => "Hi {$admi} " . implode($msg) . " Is issued ...\nRegards" ]; $url = "http://www.smszone.in/sendsms.asp?" . http_build_query($params); // 初始化cURL会话 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 如果接口是HTTPS且证书有问题,可以加这行忽略验证(可选) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $homepage = curl_exec($ch); curl_close($ch); if($homepage) { echo "Message Send Completed..."; }else{ echo "Something Went Wrong..."; }
3. URL里的实体编码和参数正确性问题
注意你代码里用了&,这是HTML里的实体编码,在PHP字符串里直接用&就好,虽然浏览器可能会自动转,但直接写&更稳妥。另外还要确认几个点:
page参数的值SendSmsBulk是不是接口要求的正确值?- 用户名、密码有没有输错?
- 手机号格式是否符合接口要求(比如要不要带+号或者国家码)?
4. 服务器网络或防火墙限制
如果你的服务器没法访问http://www.smszone.in,也会触发警告。可以在服务器命令行里用curl测试下连通性:
curl "http://www.smszone.in/sendsms.asp?page=SendSmsBulk&username=你的用户名&password=你的密码&number=测试手机号&message=测试内容"
如果命令行也访问失败,那大概率是服务器防火墙限制了出站请求,得联系主机服务商开放80端口的访问权限。
内容的提问来源于stack exchange,提问作者user3521051

