Php 如果没有internet连接,则持续加载
我目前正在开发一个在线控制的家庭,但我有一个与互联网连接检查器的问题 我有这个代码来检测是否有互联网连接或没有互联网连接Php 如果没有internet连接,则持续加载,php,apache,raspberry-pi,raspberry-pi3,Php,Apache,Raspberry Pi,Raspberry Pi3,我目前正在开发一个在线控制的家庭,但我有一个与互联网连接检查器的问题 我有这个代码来检测是否有互联网连接或没有互联网连接 $check = @fsockopen("www.google.com", 80); if($check){ return true; fclose($check); }else{ return false; fclose($check); } 但问题是,当我的Raspberry Pi没有互联网连接时,它会永远持续加载页面 完整的脚本在
$check = @fsockopen("www.google.com", 80);
if($check){
return true;
fclose($check);
}else{
return false;
fclose($check);
}
但问题是,当我的Raspberry Pi没有互联网连接时,它会永远持续加载页面
完整的脚本在这里
<?php
function checkConnection(){
$check = @fsockopen("www.google.com", 80);
if($check){
return true;
fclose($check);
}else{
return false;
fclose($check);
}
}
if(checkConnection()==true){
echo '[{"status":"success","result":"Internet Connection is Available"}]';
}else{
echo '[{"status":"fail","result":"No Internet Connection"}]';
}
?>
也许对您的功能进行一点小小的更改就可以说明这种情况。例如:
function checkConnection() {
$fp = @fsockopen("www.google.com", 80, $errno, $errstr, 3);
if (!$fp) {
return "$errstr ($errno)<br />\n";
} else {
return true;
}
}
$con = checkConnection();
if ($con===true) {
echo json_encode( ["status" => "success","result" => "Internet Connection is Available"] );
} else {
// should not be - No Internet Connection is Available
echo json_encode( ["status" => "fail","result" => $con] );
}
您可能希望在设置gethostbyname
的可选选项时检查这一点
将超时作为最后一个参数,仅在连接套接字时应用
DNS查找也可能是一个因素,因为您无法控制超时,除非您打算使用gethostbyname()
,在这种情况下,您可以使用
putenv('RES_OPTIONS=retrans:1重试:1超时:1次尝试:1')代码>
将DNS查找限制为1s
根据你的代码,我将如何实现它
function is_connected()
{
//1. provide a timeout to your socket
//2. use example.com as a domain, that's what it's made for (testing)
$socket = @fsockopen("www.example.com", 80, $err_no, $err_str, 5);
if ($socket){
fclose($socket);
return true;
}
return false;
}
$success = json_encode(["status" => "success","result" => "Internet is Available"]);
$failure = json_encode(["status" => "fail","result" => "Internet is Unavailable"]);
echo is_connected() ? $success : $failure;
仅当成功连接时才关闭套接字连接使用json_encode
回送您的响应,例如,echo json_encode([“状态”=>“成功”,“结果”=>“Internet连接可用”])代码>我尝试了你的两个建议,但结果仍然是一样的:(当没有internet连接时,你的功能将无法工作,因为DNS将无法解析主机名。?尝试使用IP并在末尾设置超时。还要检查google是否允许端口80连接!!实际上我的建议不是关于这个问题:)只是一个提示,正如@ CoderSam所说,DNS将尝试解决Google .com域,这将需要很长时间才能超时,考虑将超时参数添加到您的<代码> FSOCKOPEN(…,$TimeOutt);<代码>它仍在加载。永无止境load@MarverickM. 根据本问题中给出的代码片段和在PHPFiddle中完成的测试,您应该会得到一个错误。请发布可能有助于解决此问题的任何其他相关代码。@MarverickM。此外,您可能需要更改此示例函数的位,以便在DNS查找失败时提供错误
function is_connected()
{
//1. provide a timeout to your socket
//2. use example.com as a domain, that's what it's made for (testing)
$socket = @fsockopen("www.example.com", 80, $err_no, $err_str, 5);
if ($socket){
fclose($socket);
return true;
}
return false;
}
$success = json_encode(["status" => "success","result" => "Internet is Available"]);
$failure = json_encode(["status" => "fail","result" => "Internet is Unavailable"]);
echo is_connected() ? $success : $failure;